diff --git a/CHANGELOG.md b/CHANGELOG.md index 53626e7..b01d94f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ > 所以不是每个版本号都有条目。条目格式 `## <版本> — <日期>`,新条目加在最上面。 > 工程口径的完整记录见 `PROGRESS.md` / git log。 +## 0.58.1 — 2026-07-10 + +- Pro 档模型选单再新增 2 个国际模型(一个旗舰档、一个轻量快速档),按任务需要选用。 + ## 0.58.0 — 2026-07-10 - Pro 档图像生成新增国际模型后端「GPT 生图」:顶栏图像模型下拉可切换。仅支持文字描述生图(改图、指定尺寸/比例请切回豆包 Seedream),单张约 1 分钟,与豆包共用每日图片配额。 diff --git a/PROGRESS.md b/PROGRESS.md index 516e777..1667cc8 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -23,6 +23,7 @@ ### 2026-07 +- **07-10 / 0.58.1**:**unifyllm 文本模型再加 2 个进 pro 档**——`gpt55`(gpt-5.5)/`gpt54_mini`(gpt-5.4-mini),参数照 gpt56_sol 模板(temp 硬约束 1.0),mini 档 tool_calling/code_quality 记 good、max_iterations 100;网关 `GET /v1/models` 确认模型 ID + diag 冒烟(tool-calling)两模型均过 + `ModelCapabilities.load` 线上路径验证;`diag_unifyllm.py` 默认清单 5→7 个(RUN.md 同步)。 - **07-10 / 0.58.0**:**第二图像后端 gpt_image(unifyllm 网关,pro 档)**——媒体 provider 从豆包单家泛化为多家:新 `config/media/unifyllm.yaml`(image 段 `gpt_image` variant,model=gpt-5.6-sol 渠道)+ 新 tool `tools/gpt_image.py`(仅 prompt 参数——网关实测忽略 size/quality,尺寸上游自动定,不支持 i2i;b64 直落 `figures/`,banner 协议同 seedream,价目未知期 cost 记 0、usage tokens 进 units 留对账)。装配泛化:`ArkConfig.load` 支持通用键名 `api_key_env`/`base_url`(ark_* 旧键兜底);`agent_builder._choose_image_variant` 跨 provider 选 image variant(豆包在前 = 默认仍 seedream_5,本 run 只挂选中的一个图像工具),`_MEDIA_TOOLS_BLOCK` 拆分段按实挂工具拼装(`_media_tools_block`,gpt_image 段自带"不支持改图/尺寸→建议切回 Seedream"红线);web `_list_media_variants` 扫 `config/media/*.yaml`(image/video 清单、admin 门控 catalog 同步泛化,variant key 跨文件唯一、撞名先读生效);`media.js` 三处白名单加 gpt_image(banner/产物 chip/摘要行);prompt 润色 hint 无 default_size 时不再谎报 2048。`gpt_image` 进 pro 档(与 seedream 共享 images_per_day 配额,kind=image 同口径)。手工验证 `scripts/test_gpt_image_manual.py`(variant 选择 4 例 + prompt 块 3 例 + 真调网关落图)全过,unittest 全量 201 过。 - **07-10 / 0.57.0**:**unifyllm 网关接入(5 个国际旗舰模型进 pro 档)**:新档案 `config/models/unifyllm.yaml`(fable5/opus48/sonnet46/gpt56_sol/gemini31_pro,litellm `openai/` 前缀 + `api_base=https://unifyllm.ai/v1` + `UNIFYLLM_API_KEY`,零代码改动),`agent.yaml model_tiers.pro` 加 5 条。实测坑(全记在 yaml 头注释):gpt-5.x 被 litellm 硬拦 temp≠1、gemini-3.1-pro temp=0.3 返回空 → 两者 `optimal_temperature: 1.0`;`parallel_tool_calls` 参数网关接受(claude 实测 2 并行);流式 + include_usage 5 模型全通。新 `scripts/diag_unifyllm.py`(--stream/--temp,列模型 GET /v1/models)。**部署注意:服务器直连 unifyllm.ai TLS 握手失败,需代理出口(HTTPS_PROXY),部署前先跑 diag 验证**。价格字段暂 0(网关价目未知,成本先记 0)。 - **07-10 / 0.56.0**:**后台进程 bg proc(DESIGN §8.12)**——解掉"长脚本被工具超时掐死 / 占死 run / 蓝绿切换陪葬"三连:`shell`/`run_python` 加 `background=true`(模型按预计时长自选,前台超时报错里提示改走后台;默认上限 7200s、cap 86400s、每用户并发 3 个 `ZCBOT_MAX_BG_PROCS`),新 `check_process` 工具查状态/日志尾部/kill。状态协议纯文件(`/.zcbot_procs///{proc.json,output.log,exit_code}`,dotfile 用户不可见,exit_code 出现即终态),无 DB 无队列组件。host 模式 detach 独立 wrapper(`core/proc_wrapper.py`,stdlib-only,限时+杀树+截尾 10MB);docker 模式**专用容器** `zcbot-proc-`(`pool.run_proc_container`,同款硬化/iptables init,product=proc + 无 instance label → 与 sandbox 的 idle reaper/shutdown_all 生命周期解耦,dockerd 托管扛蓝绿)。回收:check_process 见终态顺手 rm 容器 + web lifespan 每小时 `procs.sweep`(终态目录 7d TTL、exited 孤儿容器)。**前端可视 + 通知**:`GET /v1/procs`(用户级)+ `POST /v1/tasks/{id}/procs/{pid}/kill` 两端点(纯文件读取无 DB);`procs.js` 把 `[Background]` 工具结果卡活化(spinner+summary 跳秒+停止按钮,与前台工具卡同体验;历史重渲同样恢复活态/终态定格 exit·耗时)+ running→终态弹 toast(右下角,跨 task 也提醒、点击跳转对应任务)+ **对话锁**(bg proc 运行期 composer 发送→停止、Enter 拦截,观感与前台执行一致,完成的那次轮询解锁;锁仅前端,服务端不 409——停止入口须可达);轮询式(仅有 running proc 时 5s 一拉,触发点:登录/选 task/run 收尾/[Background] 工具结果)——不走 SSE,proc 完成时刻往往没有活跃 run。LLM 超时最终定为**显式化默认 600s + env 可调**(长工具已走后台,LLM 单调用无正当 600s 静默;被掐再调 `ZCBOT_LLM_TIMEOUT_S`)。手工验证 `scripts/test_bgproc_manual.py` 全过(win host 模式:启动/探活/exit 0/日志/kill 137/sweep),unittest 全量 201 过。同批带上:**seedance `resume_task_id` 续查**(超时/中断后拿 cgt_id 跳过提交直接续轮询,不过配额闸不重复计费;fast/pro poll_timeout 统一 1200s)+ **LLM 超时显式化**(`core/llm.py` 显式传 litellm timeout,env `ZCBOT_LLM_TIMEOUT_S` 可调,见后)。 diff --git a/RUN.md b/RUN.md index db6a4d0..3897717 100644 --- a/RUN.md +++ b/RUN.md @@ -47,7 +47,7 @@ # 未设:unifyllm.* 文本 variant 调用即抛 RuntimeError;gpt_image tool 不注册、 # 图像模型下拉仍列出但选了也 fallback 回 seedream(其他模型不影响)。 # ★ 服务器直连 unifyllm.ai TLS 握手失败,需代理出口(HTTPS_PROXY); - # 部署前 `.venv/Scripts/python.exe scripts/diag_unifyllm.py` 冒烟验证(5 模型 tool-calling) + # 部署前 `.venv/Scripts/python.exe scripts/diag_unifyllm.py` 冒烟验证(7 模型 tool-calling) UNIFYLLM_API_KEY=sk-... ZCBOT_DB_URL=postgresql://user:pass@host:5432/zcbot # main.py web 必填(probe/db/user 不验) diff --git a/config/agent.yaml b/config/agent.yaml index fc2a739..4a69e9a 100644 --- a/config/agent.yaml +++ b/config/agent.yaml @@ -32,6 +32,8 @@ model_tiers: - unifyllm.opus48 - unifyllm.sonnet46 - unifyllm.gpt56_sol + - unifyllm.gpt55 + - unifyllm.gpt54_mini - unifyllm.gemini31_pro - seedream_5 - gpt_image # 图(config/media/unifyllm.yaml image 段,GPT 生图) diff --git a/config/models/unifyllm.yaml b/config/models/unifyllm.yaml index 7551ff7..f35f93e 100644 --- a/config/models/unifyllm.yaml +++ b/config/models/unifyllm.yaml @@ -1,6 +1,6 @@ # unifyllm 网关模型档案(https://unifyllm.ai,多协议 LLM 网关) # 走 OpenAI 兼容端点:litellm `openai/` 前缀 + api_base 覆盖,key 用 Bearer 认证。 -# 网关上还有 claude-sonnet-5 / opus 4-5~4-7 / gpt-5.4/5.5 / gemini-3.5-flash 等, +# 网关上还有 claude-sonnet-5 / opus 4-5~4-7 / gpt-5.4 / gemini-3.5-flash 等, # 按需加 variant 即可(GET /v1/models 可拉全量,见 scripts/diag_unifyllm.py)。 # # 注意事项(2026-07-10 实测,见 diag_unifyllm.py): @@ -93,6 +93,46 @@ variants: prompt_caching: false extended_thinking: false + gpt55: + display_name: GPT-5.5 + model_id: openai/gpt-5.5 + api_base: https://unifyllm.ai/v1 + api_key_env: UNIFYLLM_API_KEY + max_context: 262144 + reliable_context: 131072 + max_output: 8192 + parallel_tools: true + tool_calling_quality: excellent + thinking_mode: false + reasoning_effort_levels: [] + default_reasoning_effort: "" + code_quality: excellent + enable_run_python: true + max_iterations: 120 + optimal_temperature: 1.0 # 硬约束:litellm 拦 gpt-5* 的 temp != 1 + prompt_caching: false + extended_thinking: false + + gpt54_mini: + display_name: GPT-5.4 Mini + model_id: openai/gpt-5.4-mini + api_base: https://unifyllm.ai/v1 + api_key_env: UNIFYLLM_API_KEY + max_context: 262144 + reliable_context: 131072 + max_output: 8192 + parallel_tools: true + tool_calling_quality: good + thinking_mode: false + reasoning_effort_levels: [] + default_reasoning_effort: "" + code_quality: good + enable_run_python: true + max_iterations: 100 + optimal_temperature: 1.0 # 硬约束:litellm 拦 gpt-5* 的 temp != 1 + prompt_caching: false + extended_thinking: false + gemini31_pro: display_name: Gemini 3.1 Pro model_id: openai/gemini-3.1-pro-preview diff --git a/core/__init__.py b/core/__init__.py index e3f6a91..2264dc8 100644 --- a/core/__init__.py +++ b/core/__init__.py @@ -1,3 +1,3 @@ # zcbot 版本号单一事实源:web/app.py 的 FastAPI version、/healthz 返回、前端展示都引这里。 # 改版本只动这一行。 -__version__ = "0.58.0" +__version__ = "0.58.1" diff --git a/scripts/diag_unifyllm.py b/scripts/diag_unifyllm.py index 22e7de0..dfbfac5 100644 --- a/scripts/diag_unifyllm.py +++ b/scripts/diag_unifyllm.py @@ -3,7 +3,7 @@ 用法(.env 在仓库根, 含 UNIFYLLM_API_KEY): .venv/Scripts/python.exe scripts/diag_unifyllm.py [model_id ...] -不带参数时测默认 5 个精选模型。走 litellm openai/ 前缀 + api_base, +不带参数时测默认 7 个精选模型。走 litellm openai/ 前缀 + api_base, 与 core/llm.py 线上路径一致。输出一律 ASCII(Windows 控制台 GBK)。 """ import os @@ -27,6 +27,8 @@ DEFAULT_MODELS = [ "claude-opus-4-8", "claude-sonnet-4-6", "gpt-5.6-sol", + "gpt-5.5", + "gpt-5.4-mini", "gemini-3.1-pro-preview", ]