14.7 IDE 集成与每轮模型配置
本章详细介绍如何将 `rust-agent-host` 作为 IDE 的服务端进程,通过 ACP 协议对接聊天窗口,并支持每轮对话动态传递模型配置。
架构概览
graph LR
subgraph IDE 客户端
UI[聊天窗口 UI]
MC[模型配置选择器]
end
subgraph Host 服务端
ACP[ACP Agent Handler]
ROUTER[Prompt Router]
SH[Simple Agent Handler]
WF[Workflow Agent Handler]
BRIDGE[Session Bridge]
end
subgraph RAF 核心
AGENT[IAgent / WorkflowRuntime]
COMP[TokenBudget 压缩]
LLM[LLM Client]
end
UI -->|session/prompt + _meta.raf.model_config| ACP
MC -->|temperature/thinking/max_tokens| UI
ACP --> ROUTER
ROUTER -->|简单 Agent| SH
ROUTER -->|工作流 Agent| WF
SH --> AGENT
WF --> AGENT
AGENT --> COMP
COMP --> LLM
LLM -->|session/update| ACP
ACP -->|流式输出| UI
每轮模型配置
设计原理
IDE 场景下,用户需要在不同任务间灵活切换模型参数:
- **快速问答**:低温度(0.1)、关闭思考模式、小 max_tokens - **深度重构**:高温度(0.7)、启用思考模式、大 max_tokens - **代码审查**:中温度(0.3)、启用思考模式(high 级别)
ACP 协议本身没有原生的模型配置字段。RAF 使用 `_meta.raf.model_config` 命名空间作为私有扩展通道,允许客户端在每轮 `session/prompt` 请求中传递配置覆盖项。
支持的配置字段
| 字段 | 类型 | 说明 | 默认值 | |------|------|------|--------| | `model_id` | `string` | 模型 ID(仅元数据记录,不切换已绑定客户端) | 全局配置 | | `temperature` | `float` | 温度参数(0.0 - 2.0) | 全局配置 | | `max_tokens` | `uint` | 最大输出 token 数 | 全局配置 | | `thinking` | `bool` | 是否启用思考(推理)模式 | `true` | | `thinking_level` | `string` | 思考等级:`"high"` 或 `"max"` | 无(仅 thinking=true 时生效) | | `context_window_tokens` | `uint` | 上下文窗口大小(影响压缩预算) | 全局配置 | | `max_output_tokens` | `uint` | 最大输出 token 数(影响压缩预算) | 全局配置 |
配置优先级
配置按以下优先级从高到低应用:
1. **每轮配置**(`_meta.raf.model_config`)—— 最高优先级 2. **全局配置**(`host.toml` / 环境变量 / CLI 参数) 3. **LLM 提供商默认值** —— 最低优先级
请求示例
{
"jsonrpc": "2.0",
"method": "session/prompt",
"params": {
"session_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"prompt": [
{
"type": "text",
"text": "请重构这个函数,提取公共逻辑"
}
],
"_meta": {
"raf": {
"agent_id": "coding",
"model_config": {
"temperature": 0.3,
"max_tokens": 8192,
"thinking": true,
"thinking_level": "high"
}
}
}
}
}
思考模式说明
RAF 支持DeepSeek 风格的思考(推理)模式:
- `thinking: true`:模型先输出 `reasoning_content`(推理过程),再输出 `content`(最终答案) - `thinking: false`:模型直接输出 `content` - `thinking_level: "high"`:标准推理深度 - `thinking_level: "max"`:最大推理深度(消耗更多 token)
思考内容通过 ACP `session/update` 的 `AgentThoughtChunk` 类型流式输出,客户端可将其渲染为折叠区域。
上下文管理
自动压缩
Host 服务端内置 `TokenBudgetStrategy` 上下文压缩管线,自动管理长会话的上下文窗口:
1. **Token 计数**:使用 `EstimateCounter`(约 4 字符/token)估算消息总 token 数 2. **预算计算**:`输入预算 = context_window_tokens - max_output_tokens` 3. **压缩触发**:当消息总 token 数超过预算时自动触发 4. **压缩策略**: - **Phase 1**:将旧的工具调用结果组折叠为摘要(`[Earlier tool calls: N call(s) were made and completed]`) - **Phase 2**:从最早的非系统消息开始截断,直到符合预算 - 系统消息始终保留
配置上下文窗口
在 `host.toml` 中配置模型的上下文窗口大小:
[provider]
provider = "deepseek"
model = "agnes-2.0-flash"
context_window_tokens = 128000
max_output_tokens = 8192
或通过 CLI / 环境变量:
# CLI
cargo run -p rust-agent-host -- --context-window-tokens 128000 --max-output-tokens 8192
# 环境变量
RAF_PROVIDER__CONTEXT_WINDOW_TOKENS=128000 RAF_PROVIDER__MAX_OUTPUT_TOKENS=8192 cargo run -p rust-agent-host
多模态输入(待定)
当前状态:**架构层阻断,尚未实现**。
限制说明
- ACP 协议层支持 `Image`、`Audio` 等 `ContentBlock` 类型 - RAF core 的 `ChatMessage.content: String` 是架构层阻断,无法承载图片/音频 - Host 的 `convert_blocks_to_messages` 当前静默丢弃 `Image`/`Audio` 内容块
未来规划
支持多模态需要以下改造(破坏性重构):
1. 将 `ChatMessage.content` 从 `String` 改为 `Vec<ContentPart>` 枚举 2. 在 `convert_blocks_to_messages` 中将 `ImageContent` 转换为 `ContentPart::Image` 3. 在 LLM 客户端中将 `ContentPart::Image` 转换为 vision API 格式 4. 在 `PromptCapabilities` 中声明 `image: true`
工作流 Agent 的模型配置
工作流 Agent(如 `dev-pipeline`)的模型配置处理与简单 Agent 不同:
- **工作流图构建时**:使用全局配置创建所有子 Agent 的 LLM 客户端 - **每轮配置**:当前工作流路径不解析 `_meta.raf.model_config`(因为 `WorkflowRuntime` 直接执行图,不经过 `AgentRunOptions`) - **规划**:未来将通过 `WorkflowRuntime::start` 的 options 参数支持每轮配置注入
如果需要对工作流 Agent 使用不同的模型配置,当前方案是:
1. 在 `host.toml` 中配置全局参数 2. 重启 host 服务使配置生效 3. 或为不同模型配置创建不同的 host 实例
下一步
- [14.8 客户端集成指南](client-integration.md) —— 详细的客户端集成代码示例 - [14.2 ACP 协议与消息格式](acp-protocol.md) —— 协议细节