# deep_agent 2.0 环境变量样例 # 复制为 .env 后按需修改。所有变量均有代码内默认值(默认值 = 可跑的最小配置)。 # ============================================================ # 配置优先级 # ============================================================ # 本 .env 与「进程环境变量」冲突时谁生效: # dotenv (默认)本文件优先,防被污染的 shell 静默改掉项目配置 # process 进程环境优先,用于跑变体实例(不同端口/库/方言): # DEEP_AGENT_ENV_PRIORITY=process DB_DIALECT=mysql PORT=8081 python main.py # none 完全忽略本文件,只认进程环境与代码默认值(测试/CI) # 无论哪一档,冲突都会打 WARNING 并出现在 /health 的 config_conflicts DEEP_AGENT_ENV_PRIORITY=dotenv # ============================================================ # 模型(主 agent) # ============================================================ # provider:model 形式;deepseek* 前缀会走 langchain-deepseek(若已安装),否则走 ChatOpenAI DEEPAGENT_MODEL=deepseek-flash OPENAI_BASE_URL=https://api.deepseek.com OPENAI_API_KEY=sk-your-key-here OPENAI_TIMEOUT=180 # 模型 API 的退避重试次数(首次请求之外);429 等临时错误由 SDK 等待后重试。 # 默认 8,0 禁用;有服务端 Retry-After 时遵循 SDK 支持的等待范围。修改后重启。 OPENAI_MAX_RETRIES=8 # 当前兼容网关的流式工具调用返回空 delta;False 让带工具的模型请求读取完整 JSON。 # 应用的 SSE 进度事件保留;接入支持完整工具流的模型服务后可改为 True。重建 Agent/重启生效。 OPENAI_TOOL_CALL_STREAMING=False # 思考级别:off / high / highest(烧进模型实例,重启生效) # Qwen3.5 的 high/highest 均通过 chat_template_kwargs.enable_thinking=true 开启思考。 DEEPAGENT_THINKING=highest # ============================================================ # 服务 # ============================================================ HOST=0.0.0.0 PORT=8080 # INFO:启动、任务及请求汇总;DEBUG:含并发位、健康检查等细节 LOG_LEVEL=INFO # text:本地阅读;json:每行一条结构化日志,适合采集 LOG_FORMAT=text # 可选文件日志,仍同时输出 stdout;空值只输出 stdout。 LOG_FILE= LOG_MAX_MB=20 LOG_BACKUP_COUNT=5 # ============================================================ # SQLite(会话历史 / 业务任务 / 计费 / 调度) # ============================================================ DB_DIALECT=sqlite DB_SQLITE_PATH=data/vent_agent.sqlite # 旧 MySQL 部署可显式设 DB_DIALECT=mysql,以下配置在 SQLite 模式下不使用。 DB_HOST=127.0.0.1 DB_PORT=3306 DB_USER=root DB_PASSWORD= DB_NAME=vent_agent_v2 DB_PING_IDLE_SECONDS=60 # ============================================================ # 图状态(checkpoint) # ============================================================ # sqlite:图状态与中断上下文落盘(默认);memory:纯内存,重启即丢 CHECKPOINTER=sqlite CHECKPOINT_DB_PATH=data/checkpoints.sqlite # 网页智能体测试工作台;资料与执行记录使用本应用SQLite和独立测试会话。 TEST_LAB_ENABLED=1 TEST_LAB_DATA_DIR=data/test_lab # 可选:内置PDF/图片/JSON样例所在目录;未配置时尝试同级陕西局代码/测试数据。 TEST_LAB_SAMPLE_DIR= # ============================================================ # 上下文与压缩 # ============================================================ # 声明的上下文窗口(0 = 用模型登记值)。 # 这是压缩的唯一调节旋钮:框架在「声明窗口的 85%」处触发摘要压缩, # 想更早压缩就把这里调小(例如真实窗口 128000、想 70% 触发 → 填 105000)。 CONTEXT_LIMIT=0 # 自动压缩开关。关掉会同时失去「淘汰历史自动落盘到 /conversation_history/」 # 的能力——长会话会硬撑到超窗报错,只在排查压缩相关问题时才关。 CTX_COMPACT_ENABLED=1 # 冷启动从会话历史补种的最近消息条数 CTX_RECENT_LIMIT=30 # ============================================================ # 人机协同(HITL) # ============================================================ # 需要人工审批的工具(逗号分隔),会追加到默认的计划审批工具之上。 # 未注册的工具名会阻止启动,避免审批配置拼写错误被忽略。 # 例:HITL_TOOLS=calculate → 每次计算都要用户点头,便于自测中断闭环 HITL_TOOLS= # ============================================================ # 计费 # ============================================================ # False:仅记录Token用量,不要求模型单价,也不计算费用。 BILLING_ENABLED=False # 每用户每日 token 限额(0 = 不限);预检 fail-closed TFAGENTS_DAILY_TOKEN_LIMIT=0 # 模型未在 billing_pricing 表中定价时:0=直接报错(fail-closed,默认) # 1=按 0 价计费并告警(仅本地开发用,会让用量数字失真) BILLING_ALLOW_UNPRICED=0 # ============================================================ # 并发闸(超限直接 429,不排队) # ============================================================ TFAGENTS_MAX_CONCURRENT_TASKS=10 TFAGENTS_MAX_USER_TASKS=2 TFAGENTS_TASK_WALL_TIMEOUT=1800 # 独立算法:单图/批量共享并行上限,批量等待名额;配置变更后重启。 ALGORITHM_MAX_PARALLEL=2 # 所有批次合计等待及执行中的图片上限 ALGORITHM_MAX_PENDING_IMAGES=100 ALGORITHM_RESULT_TTL_HOURS=24 ALGORITHM_JOB_DIR=data/algorithm_jobs # ============================================================ # 鉴权 # ============================================================ # 2.0 骨架不做鉴权:user_name 由 /api/chat 的 multipart 字段自报,缺省 default。 # 此开关保留给后续接入真实鉴权时使用,当前无效。 AUTH_ENABLED=0 # ============================================================ # 观测 # ============================================================ TFA_TRACE_MIDDLEWARE=1 # 离线扩展示例:共享术语表服务 + 工具 + 上下文中间件,默认关闭 CONTEXT_DEMO_ENABLED=0 # ============================================================ # 多业务智能体;当前启用主通风机资料核验和初步筛查 # ============================================================ MAIN_FAN_ENABLED=1 MAIN_FAN_MAX_CONCURRENCY=1 BUSINESS_RECURSION_LIMIT=40 # Skill 自主探索预算;主通风机默认使用此模式 AGENT_EXPLORATION_RECURSION_LIMIT=480 # Python 执行器:macOS sandbox-exec;Linux 需安装 bubblewrap,不回退无沙箱执行 AGENT_PYTHON_MAX_SECONDS=120 # 地址空间限制仅 Linux;两平台均限制 CPU、执行时长、文件大小及输出长度 AGENT_PYTHON_MEMORY_MB=2048 AGENT_PYTHON_MAX_RUNS=40 # 业务任务提交、管理、记录查询的服务凭证;与对方网关凭证不同。 # 留空时这些 API 返回 503;网页聊天入口沿用现有身份机制。 BUSINESS_API_TOKEN= # ============================================================ # 对方部署的陕西局取数网关(JSON 转发、文件下载鉴权) # ============================================================ SHANXI_GATEWAY_ENABLED=0 SHANXI_GATEWAY_URL= SHANXI_GATEWAY_TOKEN= # 文件所属系统根地址及下载相对路径由对方提供;不能用网关地址代替。 SHANXI_FILE_BASE_URL= SHANXI_HTTP_TIMEOUT=30 SHANXI_MAX_FILE_MB=50 # 对方给本业务的取数调用身份,与结果平台的 agentCode 分开。 MAIN_FAN_AGENT_CODE=main_fan_equivalence_agent # 保留的网关注册接口使用此研判类型;应用启动时不自动注册。 MAIN_FAN_CHECK_TYPE_CODE=main_fan_equivalence # 真实 JSON 接口路径由对方提供;响应通过 main_fan/data_source.py 显式适配。 MAIN_FAN_DEVICES_PATH= MAIN_FAN_POINTS_PATH= MAIN_FAN_REPORTS_PATH= # 本地模拟分别使用 /mock-platform/main-fan/series 和 /mock-platform/main-fan/states。 MAIN_FAN_SERIES_PATH= MAIN_FAN_SWITCHES_PATH= MAIN_FAN_OPERATION_LOG_PATH= # 按测点查询历史曲线的单次窗口与采样数上限,超限明确报错,可分段查询。 MAIN_FAN_SERIES_MAX_HOURS=24 MAIN_FAN_SERIES_MAX_SAMPLES=200000 # 批次总开关;容器部署可开启。始终保留本地结果,推送由 RESULT_PLATFORM_ENABLED 控制。 MAIN_FAN_LOCAL_BATCH_ENABLED=0 # crawler:正式资料服务 + 挂载目录;mock:显式使用下方测试PDF。 MAIN_FAN_REPORT_MODE=crawler MAIN_FAN_REPORT_API_URL=http://10.244.3.155:19010 MAIN_FAN_REPORT_SOURCE_DIR=/data/source_data MAIN_FAN_REPORT_TYPE=通风机性能测定报告 # 留空使用本批次截止月份;仅影响采集请求,目录中的同年度往期PDF也会交给Agent核对。 MAIN_FAN_REPORT_PERIOD= MAIN_FAN_REPORT_TIMEOUT_SECONDS=30 MAIN_FAN_REPORT_POLL_SECONDS=3 MAIN_FAN_REPORT_TASK_TIMEOUT_SECONDS=900 MAIN_FAN_REPORT_MAX_FILES=30 MAIN_FAN_REPORT_MAX_FILE_MB=50 # 批次研判采用固定 workflow:Python 提取文本,GLM OCR 失败页再交给 Qwen 补识别。 MAIN_FAN_OCR_BASE_URL=http://10.244.3.155:10803/v1 MAIN_FAN_OCR_MODEL=glm-ocr # OCR 服务独立鉴权;留空不发送 Authorization,不复用 Qwen 的密钥。 MAIN_FAN_OCR_API_KEY= MAIN_FAN_OCR_TIMEOUT_SECONDS=120 MAIN_FAN_OCR_MAX_TOKENS=4096 MAIN_FAN_OCR_CONCURRENCY=2 # 补识别复用现有 Qwen 模型、地址、鉴权和思考开关,不将其密钥发送给 GLM。 MAIN_FAN_QWEN_OCR_TIMEOUT_SECONDS=240 MAIN_FAN_QWEN_OCR_MAX_TOKENS=8192 MAIN_FAN_PDF_DPI=150 MAIN_FAN_PDF_MAX_SIDE=2200 # auto 复用成功的原始提取;refresh 重新提取并更新缓存;off 不读写缓存。 MAIN_FAN_PDF_CACHE_POLICY=auto # Qwen 复用 DEEPAGENT_MODEL / OPENAI_BASE_URL / OPENAI_API_KEY 和最高思考配置。 # 业务研判只调用一次;JSON 不合格时只发送错误 JSON/Schema/错误信息做格式修复。 MAIN_FAN_WORKFLOW_MAX_TOKENS=16384 MAIN_FAN_WORKFLOW_TIMEOUT_SECONDS=600 # 0 关闭格式修复;最多允许 3 次,不重跑业务研判。 MAIN_FAN_JSON_REPAIR_MAX_ATTEMPTS=3 # 新工作流默认仅本地保存。未来上报时须与 RESULT_PLATFORM_ENABLED 同时开启。 MAIN_FAN_WORKFLOW_PUBLISH_ENABLED=False MAIN_FAN_MOCK_REPORT_PDF= MAIN_FAN_BATCH_OUTPUT_DIR=outputs/main_fan_batches # 独立启动批次:按清单顺序取前N矿;分日部署建议关闭,避免重启额外研判。 # 关闭此开关仍会恢复月度计划中已经投递但被中断的当日批次。 MAIN_FAN_BATCH_RUN_ON_STARTUP=False MAIN_FAN_BATCH_STARTUP_MAX_MINES=2 # 仅启动批次排除这些部门ID;JSON数组,支持 [1045,1106] 或 ["1045","1106"]。 # 先排除再按原数量上限选矿;[] 或留空表示不排除。 MAIN_FAN_BATCH_STARTUP_EXCLUDE_DEPT_IDS=[] # 每个实际执行批次的保护上限,0=不限制。月度分日时按每日矿数校验。 MAIN_FAN_BATCH_MAX_MINES=0 MAIN_FAN_BATCH_ALLOW_ALL=True MAIN_FAN_HISTORY_CONCURRENCY=2 # 北京时间每月1日02:00创建计划;分日批次每天同一时刻投递。 # 留空同时关闭月度计划、日调度和中断批次自动恢复,不影响独立启动批次。 MAIN_FAN_BATCH_CRON=0 2 1 * * # 冻结当月清单并均分为20份;余数分配给前几天。1=原有整批执行,未配置时默认1。 MAIN_FAN_BATCH_SPREAD_DAYS=20 # 月度范围,也是启动限量批次的候选范围;all=全部正常生产煤矿。 MAIN_FAN_BATCH_DEPT_IDS=all # 安全监控及重大设备实时列表每页请求上限,工具默认每页100条。 MAIN_FAN_REALTIME_MAX_PAGE_SIZE=1000 MAIN_FAN_RULES_FILE=examples/main_fan/equivalence_rules.json # 简短业务请求的身份目录;真实环境配置正式编码。模拟目录绑定本地网关,不能用于真实网关。 MAIN_FAN_TARGETS_FILE= # 简短请求默认重新读取原件;完整结构化输入可显式指定缓存策略。 MAIN_FAN_DEFAULT_DOCUMENT_CACHE_POLICY=refresh # 自动扫描件识别需要兼容当前模型服务的视觉模型,并配置该模型的计费单价。 # 当前 DeepSeek 官方 deepseek-flash 已支持图像;可复用主模型凭证。 MAIN_FAN_VISION_MODEL= # 文本 PDF 的结构化模型,留空默认主模型;两种模型可分别指定其他兼容服务。 MAIN_FAN_TEXT_MODEL= MAIN_FAN_VISION_BASE_URL= MAIN_FAN_VISION_API_KEY= MAIN_FAN_TEXT_BASE_URL= MAIN_FAN_TEXT_API_KEY= MAIN_FAN_MAX_DOCUMENT_PAGES=32 MAIN_FAN_DOCUMENT_TIMEOUT=180 MAIN_FAN_DOCUMENT_BATCH_PAGES=2 MAIN_FAN_DOCUMENT_MAX_TOKENS=20000 # 生产默认不使用人工转录缓存;旧离线演示才显式开启。 MAIN_FAN_ALLOW_MANUAL_CACHE=0 # 数据筛查窗口,不是工程安全阈值;采集时间按 Asia/Shanghai 解释。 MAIN_FAN_FRESHNESS_SECONDS=600 MAIN_FAN_SYNC_SECONDS=120 # ============================================================ # 独立的研判结果接收平台;不使用 SHANXI_GATEWAY_URL/TOKEN # ============================================================ # False:仅保留本地;True:保留本地,并将已完成的批次研判加入持久化推送队列。 RESULT_PLATFORM_ENABLED=False # 完整的 POST 接口地址。本地接收平台:http://127.0.0.1:8767/api/judgments RESULT_PLATFORM_URL= RESULT_PLATFORM_TOKEN= # 默认 Authorization: Bearer 。自定义 API Key 可用 X-API-Key + scheme=none。 # 无鉴权接口显式设置 AUTH_HEADER=none;不向网关索取结果平台凭证。 RESULT_PLATFORM_AUTH_HEADER=Authorization RESULT_PLATFORM_AUTH_SCHEME=Bearer RESULT_PLATFORM_TIMEOUT=30 # 支持嵌套字段,如 data.code。HTTP 204 直接视为接收成功;其余成功响应必须匹配。 RESULT_PLATFORM_SUCCESS_FIELD=code RESULT_PLATFORM_SUCCESS_VALUES=0,200 MAIN_FAN_RESULT_AGENT_CODE=main_fan_equivalence_agent MAIN_FAN_RESULT_AGENT_NAME=矿井主通风机同等能力研判 # 启用结果平台后,网页/工具研判完成即入推送队列;设0则只生成结果。 # 任务 API 以每次请求的 publish 字段为准。 MAIN_FAN_AUTO_PUBLISH=1