agent-Specialization/config/server.py
JOJO b8a51c1c63 refactor(config): 移除硬编码模型残留,部署级配置外置到 ~/.agents
## 模型逻辑清理
早期把模型 API 端点/密钥/模型 ID 硬编码的残留(AGENT_API_* / THINKING_* /
TITLE_* 三件套)已彻底移除。模型配置统一由 config/custom_models.json
(经 model_profiles 解析为档案)描述,运行时通过 apply_profile 注入;
没有任何可用模型时按既定行为报错。

- config/api.py: 删 9 个三件套符号,仅保留 DEFAULT_RESPONSE_MAX_TOKENS
- utils/api_client.py: client 改为空配置起步,移除三件套 import
- server/chat_flow_helpers.py: 删死 import(TITLE_* 符号)

## 部署级配置外置(按"决策权归谁"分类)
config/*.json 不再一概锚定源码树:
- 程序能力(docker_risk_markers / skill_hints)留源码树,随版本演进
- 部署者自定义(custom_models / host_workspaces / auto_approval /
  goal_review / forbidden_commands / host_sandbox_policy)外置到
  ~/.agents/<mode>/config/

新增统一解析机制(config/paths.py):
- DEPLOY_CONFIG_DIR(默认 ~/.agents/<mode>/config,可用环境变量覆盖)
- resolve_deploy_config():只读,回退链 部署目录→源码树.json→源码树.example
  (开发环境不必先跑 setup 也能用源码树种子)
- deploy_config_path():写回用,稳定指向部署目录

6 个加载点改用上述解析;顺带修复 approval_agent / goal_review_agent 的
DEBUG_TRANSCRIPT_DIR 仍指旧源码树 logs/ 的漏迁问题。

## 安全与运维
- 含密钥/机器特定的 5 个文件停止 git 追踪(git rm --cached,本地保留)
  并加入 .gitignore,仓库仅留 .example 种子;forbidden_commands 保留
  追踪作默认黑名单
- scripts/setup.py: 模型配置写到部署目录(用与 paths 一致的独立推导,
  不 import config 以免过早锁定路径)
- scripts/migrate_runtime_data.py: 新增 config/*.json → 部署目录迁移
  (备份 + 不覆盖已存在)

## 关联:P1 配置收敛 + P2 首启向导
- config/server.py: Web 端口/监听地址/debug/NODE_BIN/PYTHON_BIN 单一事实源
- 消灭 8091 多处重复定义(state.py 死代码、app_legacy、main.py 各读各的)
- 修复 sub_agent_manager 命令数组硬编码 "node" → NODE_BIN(便携包内置
  Node 的前提)
- scripts/setup.py: 终端首启向导(模式/端口/管理员/密钥/模型)

## 测试
test_config_paths_resolution 更新以反映新行为(host_workspaces 锚定部署
目录、新增 DEPLOY_CONFIG_DIR 用例);全部离线用例通过。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 16:59:34 +08:00

43 lines
1.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Web 服务与运行环境配置(单一事实源)。
集中所有"部署/运行"相关配置,避免端口、监听地址、运行二进制路径等散落多处、
各读各的。全项目应统一从 ``config`` 导入这里导出的常量,禁止再硬编码。
解析优先级:环境变量 > 此处默认值;命令行参数(如 ``--port``)可在入口层再覆盖。
"""
import os
def _env(name: str, default: str = "") -> str:
return str(os.environ.get(name, "") or "").strip() or default
def _flag(name: str, default: str = "0") -> bool:
return _env(name, default).lower() in ("1", "true", "yes", "on")
# === Web 服务 ===============================================================
# 监听端口(历史上散落在 main.py / server.app_legacy / server.state / cli
WEB_SERVER_PORT = int(_env("WEB_SERVER_PORT", "8091"))
# 监听地址:多用户/服务器用 0.0.0.0;单机便携包建议设 127.0.0.1 只听本机。
WEB_SERVER_HOST = _env("WEB_SERVER_HOST", "0.0.0.0")
# 调试模式(同时控制 Flask reloader
WEB_SERVER_DEBUG = _flag("WEB_SERVER_DEBUG", "0")
# === 运行环境二进制 =========================================================
# 便携 release 包启动脚本会注入这两个绝对路径,使主程序与子智能体使用内置运行时。
# 留空/默认时回退到系统 PATH 上的 node开发环境或系统已安装时
NODE_BIN = _env("AGENT_NODE_BIN", "node")
# Python 解释器路径;留空表示使用当前进程的 sys.executable。
PYTHON_BIN = _env("AGENT_PYTHON_BIN", "")
__all__ = [
"WEB_SERVER_PORT",
"WEB_SERVER_HOST",
"WEB_SERVER_DEBUG",
"NODE_BIN",
"PYTHON_BIN",
]