模型服务提供商配置

A3S Code 从 ACL 读取运行时配置。配置源可以是 .acl 文件路径,也可以是 内联 ACL 字符串。JSON 和旧 HCL 配置不属于当前配置面。

基本结构

ACL
default_model = "provider/model-id"
max_parallel_tasks = 4
auto_parallel = false
providers "provider" {
apiKey = env("PROVIDER_API_KEY")
baseUrl = env("PROVIDER_BASE_URL")
models "model-id" {
name = "Human readable model name"
tool_call = true
limit = {
context = 128000
output = 4096
}
}
}
storage_backend = "file"
sessions_dir = ".a3s/sessions"

apiKey 与 api_key 都可用,baseUrl 与 base_url 都可用。仓库里只提交模板 和非敏感默认值;真实 API Key、私有端点和账号相关模型名应放在环境变量或密钥管理系统中。

服务提供商类型

内置工厂覆盖三条路径:

服务提供商名称客户端路径说明
anthropic / claudeAnthropic 客户端使用配置中的模型标识和可选服务提供商基础 URL。
openai / gptOpenAI 兼容客户端用于兼容 OpenAI Chat Completions 的端点。
glm / zhipu / bigmodel智谱兼容客户端密钥和基础 URL 仍应从环境变量注入。
其它服务提供商名称OpenAI 兼容兜底路径适合私有或自托管的 OpenAI 兼容服务。

Coding Plan 类基础地址(例如 https://open.bigmodel.cn/api/coding/paas/v4)会正确拼接到 /chat/completions(不会加 /v1,也不会重复 /paas/v4)。

运行时不硬编码模型名。default_model 和每个会话的 model 都是 provider/model-id 形式的标识符,必须能匹配你在服务提供商配置块里声明的模型。

委派控制

ACL
agent_dirs = ["./.a3s/agents"]
auto_delegation {
enabled = true
auto_parallel = false
allow_manual_delegation = true
min_confidence = 0.72
max_tasks = 4
}

max_parallel_tasks 限制有边界的同级任务扇出。auto_delegation.enabled 开启自动子智能体委派。顶层 auto_parallel = false 会覆盖 auto_delegation.auto_parallel,只关闭自动并行子智能体扇出;手动 task 扇出仍可用。 设置 allow_manual_delegation = false 时,模型可见的 task 不会注册。

存储

ACL
sessions_dir = ".a3s/sessions"

让 ACL 加载的会话可恢复的是 sessions_dir:设置后,每个会话都会在该目录中获得 文件会话存储,同步的 Rust Agent::session 路径会返回 AsyncSessionBuildRequired。 没有 sessions_dir 也没有显式存储时,会话不会持久化。storage_backend (memory、file 或 custom;其他值按 file 处理)和 storage_url 会被解析并 保存在配置中,但没有任何运行时路径读取它们,因此它们既不会创建也不会禁用存储。 SDK 宿主也可以直接传 sessionStore: new FileSessionStore(...) / opts.session_store = FileSessionStore(...)。

代理

模型 HTTP 客户端、MCP HTTP 传输(SSE 与 streamable HTTP)以及 MCP OAuth 只从显式 环境变量读取代理:

变量作用
http_proxy / HTTP_PROXYhttp:// 请求使用的代理
https_proxy / HTTPS_PROXYhttps:// 请求使用的代理;未设置时回退到 HTTP 代理
NO_PROXY / no_proxy绕过上述代理的主机,例如 localhost 或内部 MCP 主机

这些客户端关闭了系统代理发现,因此变量未设置就表示直连。代理 URL 无效时,客户端 构建会以 Invalid HTTP proxy URL 或 Invalid HTTPS proxy URL 失败。

私有服务提供商检查

真实服务提供商的冒烟测试应通过 A3S_CONFIG_FILE 指向本地且被 Git 忽略的 ACL 文件。 不要把 provider 值复制进命令、日志、文档、PR 或已提交 fixture。

SHELLSCRIPT
A3S_CONFIG_FILE=/path/to/local/config.acl \
scripts/real_config_env_integration.sh

SDK 对齐由单独的真实 provider 检查脚本覆盖:

SHELLSCRIPT
A3S_CONFIG_FILE=/path/to/local/config.acl \
scripts/sdk_real_config_env_integration.sh

两个 Wrapper 都会找到 default_model 指定的 Provider,再写出一份仅所有者可读的 临时 ACL 副本,其中该 Provider 的 apiKey 和 baseUrl 改为读取 A3S_OPENAI_API_KEY 与 A3S_OPENAI_BASE_URL。取值顺序依次为 A3S_<PROVIDER>_API_KEY / A3S_<PROVIDER>_BASE_URL、Provider Block、已有的 A3S_OPENAI_* 变量。DeepSeek 对抗测试等专项套件直接加载 ACL:

SHELLSCRIPT
A3S_CONFIG_FILE=/absolute/path/to/.a3s/config.acl \
cargo test -p a3s-code-core --test test_deepseek_adversarial_e2e -- \
--ignored --test-threads=1 --nocapture

完整的 Node.js、Python 与 Go DeepSeek Retrieval Matrix 使用 A3S_REAL_EVAL_ROOT=/absolute/path/to/a3s;各平台命令与 Gate 见 Cross-SDK Evaluation Contract。

包含 Secret 的原始 Provider Evidence 应留在发布记录或 CI Artifact,不写入公开文档。 只有不包含 Endpoint、Header、环境变量名、Credential、Prompt 或源文本的聚合脱敏指标 才可发布。完整本地 API 表面见 API Contract。