94 lines
4.0 KiB
PHP
94 lines
4.0 KiB
PHP
<?php
|
||
|
||
/**
|
||
* 处方库与诊单 AI 报告(Dify / OpenAI-compatible)
|
||
*
|
||
* qwen/openai 分别使用各自的服务端凭据。凭据禁止下发到客户端或写入日志。
|
||
*/
|
||
return [
|
||
'enable' => 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', '')
|
||
),
|
||
],
|
||
],
|
||
];
|