feat: add durable ASR-to-patient extraction and guarded review

This commit is contained in:
2026-10-08 15:08:42 +08:00
parent 8bb4bd07ae
commit 13948f5982
34 changed files with 2377 additions and 56 deletions
+21
View File
@@ -26,6 +26,10 @@ return [
'ffmpeg' => (string) env('followup_audio.FFMPEG', 'ffmpeg'),
'ffprobe' => (string) env('followup_audio.FFPROBE', 'ffprobe'),
'max_response_bytes' => 8388608,
'asr_chunk_seconds' => (int) env('followup_audio.ASR_CHUNK_SECONDS', 120),
'asr_max_chunk_bytes' => 4194304,
'asr_request_timeout' => (int) env('followup_audio.ASR_REQUEST_TIMEOUT', 240),
'extraction_request_timeout' => (int) env('followup_audio.EXTRACTION_REQUEST_TIMEOUT', 240),
// HTTP is permitted only for explicitly acknowledged synthetic probes, never patient requests.
'allow_insecure_synthetic' => filter_var(env('followup_audio.ALLOW_INSECURE_SYNTHETIC', false), FILTER_VALIDATE_BOOLEAN),
// Stable logical slots preserve task schema. No model identifier or supplier is hardcoded.
@@ -38,6 +42,23 @@ return [
'api_key' => (string) env($prefix . 'API_KEY', ''),
'model' => (string) env($prefix . 'MODEL', ''),
'label' => (string) env($prefix . 'LABEL', $profile),
// Explicit server-only two-stage identities; no fallback to prescription_ai or another slot.
'allow_loopback_tunnel' => filter_var(env($prefix . 'ALLOW_LOOPBACK_TUNNEL', false), FILTER_VALIDATE_BOOLEAN),
'asr' => [
'base_url' => (string) env($prefix . 'ASR_BASE_URL', ''),
'api_key' => (string) env($prefix . 'ASR_API_KEY', ''),
'model' => (string) env($prefix . 'ASR_MODEL', ''),
],
'extraction' => [
'base_url' => (string) env($prefix . 'EXTRACTION_BASE_URL', ''),
'api_key' => (string) env($prefix . 'EXTRACTION_API_KEY', ''),
'model' => (string) env($prefix . 'EXTRACTION_MODEL', ''),
'response_format' => (string) env($prefix . 'EXTRACTION_RESPONSE_FORMAT', 'json_schema'),
'max_tokens' => (int) env($prefix . 'EXTRACTION_MAX_TOKENS', 8192),
// Unset is portable; explicit true/false opts into the provider's Qwen chat-template extension.
'enable_thinking' => env($prefix . 'EXTRACTION_ENABLE_THINKING', null) === null ? null
: (filter_var(env($prefix . 'EXTRACTION_ENABLE_THINKING'), FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) ?? 'invalid'),
],
'verified_fingerprint' => (string) env($prefix . 'VERIFIED_FINGERPRINT', ''),
];
}, ['qwen', 'openai'])),