Trae Agent 配置模块详解
概述
Trae Agent 的配置模块采用分层设计 ,支持 YAML 和 JSON 两种格式,实现了模型提供商、模型、Agent 的解耦配置。配置模块位于 trae_agent/utils/ 目录下。
配置文件结构
新版 YAML 配置 (trae_config.yaml)
yaml
# 1. 模型提供商配置
model_providers:
openrouter:
api_key: sk-or-v1-xxx
provider: openrouter
base_url: https://openrouter.ai/api/v1
# 2. 模型配置
models:
trae_agent_model:
model_provider: openrouter # 引用上面的提供商
model: openai/gpt-4o
max_tokens: 4096
temperature: 0.5
top_p: 1
top_k: 0
max_retries: 10
parallel_tool_calls: true
# 3. Agent 配置
agents:
trae_agent:
model: trae_agent_model # 引用上面的模型
max_steps: 200
enable_lakeview: true
tools:
- bash
- str_replace_based_edit_tool
- sequentialthinking
- task_done
# 4. MCP 服务器配置
mcp_servers:
playwright:
command: npx
args:
- "@playwright/mcp@0.0.27"
allow_mcp_servers:
- playwright
# 5. Lakeview 配置
lakeview:
model: lakeview_model
旧版 JSON 配置 (trae_config.json)
json
{
"default_provider": "anthropic",
"max_steps": 20,
"model_providers": {
"anthropic": {
"model": "claude-sonnet-4-20250514",
"api_key": "sk-xxx",
"base_url": "https://api.anthropic.com",
"max_tokens": 4096,
"temperature": 0.5
}
},
"mcp_servers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem"]
}
},
"allow_mcp_servers": ["filesystem"],
"enable_lakeview": true
}
核心配置类
1. ModelProvider - 模型提供商配置
文件 : trae_agent/utils/config.py
python
@dataclass
class ModelProvider:
"""模型提供商配置"""
api_key: str # API 密钥
provider: str # 提供商名称 (anthropic, openai, azure, etc.)
base_url: str | None = None # 基础 URL
api_version: str | None = None # API 版本 (Azure 需要)
职责: 管理 LLM API 的访问凭证和端点信息。
2. ModelConfig - 模型配置
python
@dataclass
class ModelConfig:
"""模型配置"""
model: str # 模型名称
model_provider: ModelProvider # 关联的提供商
temperature: float # 温度参数
top_p: float # top-p 采样
top_k: int # top-k 采样
parallel_tool_calls: bool # 是否并行工具调用
max_retries: int # 最大重试次数
max_tokens: int | None = None # 最大 token 数
supports_tool_calling: bool = True # 是否支持工具调用
candidate_count: int | None = None # Gemini 特有
stop_sequences: list[str] | None = None
max_completion_tokens: int | None = None # Azure OpenAI 特有
关键方法:
python
def get_max_tokens_param(self) -> int:
"""获取最大 tokens 参数,优先使用 max_completion_tokens"""
if self.max_completion_tokens is not None:
return self.max_completion_tokens
elif self.max_tokens is not None:
return self.max_tokens
else:
return 4096
def should_use_max_completion_tokens(self) -> bool:
"""判断是否应使用 max_completion_tokens (Azure OpenAI gpt-5/o3/o4-mini)"""
return (
self.max_completion_tokens is not None
and self.model_provider.provider == "azure"
and ("gpt-5" in self.model or "o3" in self.model or "o4-mini" in self.model)
)
3. MCPServerConfig - MCP 服务器配置
python
@dataclass
class MCPServerConfig:
"""MCP 服务器配置,支持多种传输方式"""
# 标准 IO 传输 (stdio)
command: str | None = None
args: list[str] | None = None
env: dict[str, str] | None = None
cwd: str | None = None
# SSE 传输
url: str | None = None
# HTTP 流传输
http_url: str | None = None
headers: dict[str, str] | None = None
# WebSocket 传输
tcp: str | None = None
# 通用配置
timeout: int | None = None
trust: bool | None = None
description: str | None = None
支持的传输方式:
| 传输方式 | 适用场景 | 关键字段 |
|---|---|---|
| stdio | 本地命令行工具 | command, args |
| SSE | 服务器推送 | url |
| HTTP | REST API | http_url, headers |
| WebSocket | 实时通信 | tcp |
4. AgentConfig - Agent 基础配置
python
@dataclass
class AgentConfig:
"""Agent 基础配置类"""
allow_mcp_servers: list[str] # 允许的 MCP 服务器列表
mcp_servers_config: dict[str, MCPServerConfig] # MCP 服务器配置
max_steps: int # 最大执行步数
model: ModelConfig # 使用的模型
tools: list[str] # 启用的工具列表
5. TraeAgentConfig - Trae Agent 专用配置
python
@dataclass
class TraeAgentConfig(AgentConfig):
"""Trae Agent 专用配置"""
enable_lakeview: bool = True # 是否启用 Lakeview
tools: list[str] = field( # 默认工具列表
default_factory=lambda: [
"bash",
"str_replace_based_edit_tool",
"sequentialthinking",
"task_done",
]
)
默认工具说明:
| 工具名称 | 功能 |
|---|---|
bash |
执行 Bash 命令 |
str_replace_based_edit_tool |
文本编辑工具 |
sequentialthinking |
顺序思考工具 |
task_done |
任务完成标记 |
6. LakeviewConfig - Lakeview 配置
python
@dataclass
class LakeviewConfig:
"""Lakeview 配置"""
model: ModelConfig # Lakeview 使用的模型
Lakeview: 用于代码分析和可视化的组件。
7. Config - 根配置类
python
@dataclass
class Config:
"""根配置类,聚合所有配置"""
lakeview: LakeviewConfig | None = None
model_providers: dict[str, ModelProvider] | None = None
models: dict[str, ModelConfig] | None = None
trae_agent: TraeAgentConfig | None = None
配置解析流程
1. 配置加载入口
python
# 从文件加载
config = Config.create(config_file="trae_config.yaml")
# 从字符串加载
config = Config.create(config_string=yaml_string)
# 从旧版 JSON 加载
config = Config.create_from_legacy_config(config_file="trae_config.json")
2. 解析流程图
scss
┌─────────────────────────────────────────────────────────────────┐
│ 1. Config.create() 入口 │
│ - 检查 config_file 或 config_string │
└────────────────────────────┬────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 2. 解析 YAML/JSON │
│ - yaml.safe_load() 解析配置 │
│ - 如果是 .json 文件,调用 create_from_legacy_config() │
└────────────────────────────┬────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 3. 解析 model_providers │
│ - 遍历 model_providers 配置 │
│ - 创建 ModelProvider 对象 │
│ - 存入 config.model_providers 字典 │
└────────────────────────────┬────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 4. 解析 models │
│ - 遍历 models 配置 │
│ - 查找引用的 model_provider │
│ - 创建 ModelConfig 对象 │
│ - 关联 ModelProvider │
└────────────────────────────┬────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 5. 解析 lakeview │
│ - 查找引用的 model │
│ - 创建 LakeviewConfig 对象 │
└────────────────────────────┬────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 6. 解析 mcp_servers │
│ - 创建 MCPServerConfig 对象 │
└────────────────────────────┬────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 7. 解析 agents │
│ - 根据 agent 类型创建对应配置对象 │
│ - trae_agent → TraeAgentConfig │
│ - 关联 model 和 mcp_servers_config │
└────────────────────────────┬────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 8. 返回 Config 对象 │
└─────────────────────────────────────────────────────────────────┘
3. 核心解析代码
python
@classmethod
def create(cls, *, config_file: str | None = None, config_string: str | None = None) -> "Config":
# 1. 加载 YAML
if config_file is not None:
if config_file.endswith(".json"):
return cls.create_from_legacy_config(config_file=config_file)
with open(config_file, "r") as f:
yaml_config = yaml.safe_load(f)
elif config_string is not None:
yaml_config = yaml.safe_load(config_string)
config = cls()
# 2. 解析 model_providers
model_providers = yaml_config.get("model_providers", {})
config.model_providers = {
name: ModelProvider(**cfg) for name, cfg in model_providers.items()
}
# 3. 解析 models
models = yaml_config.get("models", {})
config.models = {}
for model_name, model_config in models.items():
provider_name = model_config["model_provider"]
config.models[model_name] = ModelConfig(
**model_config,
model_provider=config.model_providers[provider_name]
)
# 4. 解析 lakeview
lakeview = yaml_config.get("lakeview")
if lakeview:
config.lakeview = LakeviewConfig(
model=config.models[lakeview["model"]]
)
# 5. 解析 MCP 服务器
mcp_servers_config = {
k: MCPServerConfig(**v)
for k, v in yaml_config.get("mcp_servers", {}).items()
}
allow_mcp_servers = yaml_config.get("allow_mcp_servers", [])
# 6. 解析 agents
agents = yaml_config.get("agents", {})
for agent_name, agent_config in agents.items():
model_name = agent_config["model"]
match agent_name:
case "trae_agent":
config.trae_agent = TraeAgentConfig(
**agent_config,
model=config.models[model_name],
mcp_servers_config=mcp_servers_config,
allow_mcp_servers=allow_mcp_servers,
)
return config
配置优先级与覆盖
配置值解析优先级
objectivec
CLI 参数 > 环境变量 > 配置文件值
resolve_config_value 函数
python
def resolve_config_value(
*,
cli_value: Any | None = None,
config_value: Any | None = None,
env_var: str | None = None,
) -> Any | None:
"""解析配置值,优先级:CLI > 环境变量 > 配置文件"""
# 1. 优先使用 CLI 参数
if cli_value is not None:
return cli_value
# 2. 其次使用环境变量
if env_var and env_var in os.environ:
return os.environ[env_var]
# 3. 最后使用配置文件值
return config_value
环境变量映射
python
# API Key 环境变量
ANTHROPIC_API_KEY=sk-ant-xxx
OPENAI_API_KEY=sk-xxx
OPENROUTER_API_KEY=sk-or-v1-xxx
# Base URL 环境变量
ANTHROPIC_BASE_URL=https://api.anthropic.com
OPENAI_BASE_URL=https://api.openai.com
配置覆盖示例
python
# 在 Agent 初始化时覆盖配置
config.resolve_config_values(
provider="openai", # 覆盖模型提供商
model="gpt-4o", # 覆盖模型名称
api_key="sk-new-key", # 覆盖 API Key
max_steps=50, # 覆盖最大步数
)
配置接入点
1. CLI 层接入
文件 : trae_agent/cli.py
python
from trae_agent.utils.config import Config
# 加载配置
config = Config.create(config_file=args.config)
# 解析命令行参数覆盖
config.resolve_config_values(
provider=args.provider,
model=args.model,
api_key=args.api_key,
max_steps=args.max_steps,
)
# 创建 Agent
agent = TraeAgent(
task=args.task,
agent_config=config.trae_agent,
)
2. Agent 层接入
文件 : trae_agent/agent/base_agent.py
python
class BaseAgent:
def __init__(self, agent_config: AgentConfig):
self._model_config = agent_config.model
self._max_steps = agent_config.max_steps
self._tools = self._create_tools(agent_config.tools)
self._mcp_servers = agent_config.allow_mcp_servers
3. LLM Client 层接入
文件 : trae_agent/utils/llm_clients/llm_client.py
python
def create_llm_client(model_config: ModelConfig) -> BaseLLMClient:
"""根据模型配置创建 LLM 客户端"""
provider = model_config.model_provider.provider
api_key = model_config.model_provider.api_key
base_url = model_config.model_provider.base_url
match provider:
case "anthropic":
return AnthropicClient(api_key=api_key, base_url=base_url)
case "openai":
return OpenAIClient(api_key=api_key, base_url=base_url)
case "azure":
return AzureOpenAIClient(
api_key=api_key,
base_url=base_url,
api_version=model_config.model_provider.api_version
)
4. MCP 层接入
文件 : trae_agent/agent/base_agent.py
python
async def _setup_mcp_clients(self):
"""根据配置设置 MCP 客户端"""
for server_name in self._mcp_servers:
if server_name in self._mcp_servers_config:
config = self._mcp_servers_config[server_name]
client = MCPClient(config)
await client.connect()
self._mcp_clients[server_name] = client
配置验证
1. 必填字段验证
python
# model_providers 不能为空
if not model_providers:
raise ConfigError("No model providers provided")
# models 不能为空
if not models:
raise ConfigError("No models provided")
# agents 不能为空
if not agents:
raise ConfigError("No agent configs provided")
# agent 必须指定 model
if agent_config.get("model") is None:
raise ConfigError(f"No model provided for {agent_name}")
2. 引用验证
python
# 验证 model_provider 引用存在
if model_config["model_provider"] not in config_model_providers:
raise ConfigError(f"Model provider {model_config['model_provider']} not found")
# 验证 model 引用存在
try:
agent_model = config_models[agent_model_name]
except KeyError:
raise ConfigError(f"Model {agent_model_name} not found")
3. Lakeview 验证
python
if trae_agent_config.enable_lakeview and config.lakeview is None:
raise ConfigError("Lakeview is enabled but no lakeview config provided")
核心文件索引
| 文件 | 职责 | 重要性 |
|---|---|---|
utils/config.py |
新版配置类定义和解析 | ⭐⭐⭐ |
utils/legacy_config.py |
旧版配置兼容支持 | ⭐⭐⭐ |
trae_config.yaml |
用户配置文件(新版) | ⭐⭐⭐ |
trae_config.json |
用户配置文件(旧版) | ⭐⭐ |
cli.py |
配置加载入口 | ⭐⭐⭐ |
配置模块架构图
scss
┌─────────────────────────────────────────────────────────────────┐
│ 配置模块架构 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 用户配置文件 │ │
│ │ ├── trae_config.yaml (新版) │ │
│ │ └── trae_config.json (旧版) │ │
│ └────────────────────┬────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 配置解析层 │ │
│ │ ├── Config.create() (YAML 解析) │ │
│ │ └── Config.create_from_legacy_config() (JSON 兼容) │ │
│ └────────────────────┬────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 配置对象层 │ │
│ │ ├── Config (根配置) │ │
│ │ ├── ModelProvider (提供商配置) │ │
│ │ ├── ModelConfig (模型配置) │ │
│ │ ├── TraeAgentConfig (Agent 配置) │ │
│ │ ├── MCPServerConfig (MCP 配置) │ │
│ │ └── LakeviewConfig (Lakeview 配置) │ │
│ └────────────────────┬────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 配置使用层 │ │
│ │ ├── CLI 层 (参数覆盖) │ │
│ │ ├── Agent 层 (初始化) │ │
│ │ ├── LLM Client 层 (API 调用) │ │
│ │ └── MCP 层 (工具服务器) │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
总结
| 特性 | 说明 |
|---|---|
| 配置格式 | 支持 YAML(新版)和 JSON(旧版) |
| 分层设计 | model_providers → models → agents |
| 解耦配置 | 提供商、模型、Agent 独立配置,通过引用关联 |
| 优先级 | CLI 参数 > 环境变量 > 配置文件 |
| 向后兼容 | 自动将旧版 JSON 转换为新版格式 |
| 验证机制 | 必填字段检查、引用存在性验证 |
核心优势:配置模块实现了高度的灵活性和可扩展性,支持多模型提供商、多模型、多 Agent 的复杂场景,同时保持配置的简洁和可读性。