filter_var( env('prescription_ai.ENABLE', env('prescription_ai.enable', false)), FILTER_VALIDATE_BOOLEAN ), 'base_url' => rtrim((string) env( 'prescription_ai.BASE_URL', env('prescription_ai.base_url', '') ), '/'), 'timeout' => (int) env( 'prescription_ai.TIMEOUT', env('prescription_ai.timeout', 90) ), /** * 单次请求可随附的附件总数上限。Dify 应用的 file_upload.number_limits 超限时 * 直接返回 400 invalid_param 拒绝整单,患者纵向资料的附件数量又不可控, * 因此这里必须与上游应用配置保持一致(默认 3),超出的附件改以清单形式送达。 * 各应用的上限不同时用下面 models 里的 max_files 覆盖;核对方式是只读调用 * 该应用的 /parameters,读取 file_upload.number_limits。 */ 'max_files' => (int) env( 'prescription_ai.MAX_FILES', env('prescription_ai.max_files', 3) ), // Per-model staged analysis limits. Oversized semantic units and exhausted call budgets // are explicit task errors; they never silently remove patient evidence or attachments. 'manual_analysis' => [ /** * 单次提示词的字节上限(UTF-8 字节是 token 的保守上界)。调大可减少分片与压缩 * 轮次、显著缩短一份报告的总耗时;上游应用限制更严时会返回可重试的拒绝, * 此时调小本值。 */ 'input_token_budget' => (int) env( 'prescription_ai.MANUAL_INPUT_TOKEN_BUDGET', env('prescription_ai.manual_input_token_budget', 48000) ), 'max_calls_per_model' => (int) env( 'prescription_ai.MANUAL_MAX_CALLS_PER_MODEL', env('prescription_ai.manual_max_calls_per_model', 128) ), /** * 医学研究对照模式:无论资料是否完整,两个模型都必须先各自独立开出候选处方, * 再由服务端与人工方比较。缺口、假设与复核要求写入候选方的说明与风险提示, * 不再以资料不足为由返回空方案。候选方仍不写回正式处方、审核或订单。 */ 'require_candidate' => filter_var( env('prescription_ai.MANUAL_REQUIRE_CANDIDATE', true), FILTER_VALIDATE_BOOLEAN ), /** * 后台分阶段分析的单次请求超时(秒,上限 300)。同步页面仍使用上面的 timeout; * 该值必须明显小于任务租约 prescription_analysis.lease_seconds。 */ 'request_timeout' => (int) env( 'prescription_ai.MANUAL_REQUEST_TIMEOUT', 240 ), // 模型仍拒绝开方时,携带其拒绝理由重新追问的次数。 'candidate_insist_rounds' => (int) env( 'prescription_ai.MANUAL_CANDIDATE_INSIST_ROUNDS', 2 ), ], 'models' => [ 'qwen' => [ 'name' => 'qwen3.6-35b', 'label' => '千问', // 该应用 file_upload.number_limits = 3 'max_files' => (int) env('prescription_ai.QWEN_MAX_FILES', 3), 'api_key' => (string) env( 'prescription_ai.QWEN_API_KEY', env('prescription_ai.qwen_api_key', '') ), ], 'openai' => [ 'name' => 'gpt-5.6-sol', 'label' => 'OpenAI', // 该应用 file_upload.number_limits = 10:一次多带附件可显著减少往返次数 'max_files' => (int) env('prescription_ai.OPENAI_MAX_FILES', 10), 'api_key' => (string) env( 'prescription_ai.OPENAI_API_KEY', env('prescription_ai.openai_api_key', '') ), ], ], ];