Files
steven_li 6e9e74d1ee feat(engine): 添加运行时上下文支持并重构工具迭代限制
添加 RuntimeContext 类用于捕获模型运行时的日期时间信息,
包括UTC时间、本地时间和时区信息,并在系统提示中显示这些信息。

同时增加最大上下文消息数和工具迭代次数的配置选项,
将验证服务从引擎加载器中移除,并更新相关的数据结构和接口。

BREAKING CHANGE: 移除了验证服务,相关字段被替换为证据状态和接受状态。

- 添加 RuntimeContext 类和相关渲染方法
- 增加 max_context_messages 和 max_tool_iterations 配置
- 移除 ValidationService 相关代码
- 更新消息记录中的验证状态字段
- 添加原始工具调用检测和回退处理
2026-05-26 11:18:35 +08:00

69 lines
3.7 KiB
HTML
Raw Permalink 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.

<!doctype html>
<html lang="zh-CN">
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Providers 模块蓝图</title><link rel="stylesheet" href="blueprint.css"></head>
<body><main class="page">
<header class="topbar"><h1>Providers</h1><p>Providers 把不同模型服务统一成 Beaver 内部的 <code>chat(messages, tools, model, ...)</code> 协议,屏蔽 OpenAI/LiteLLM/Anthropic/Codex/Custom 的差异。</p></header>
<nav class="nav"><a href="index.html">索引</a><a href="engine.html">Engine</a><a href="prompt-atlas.html">Prompt Atlas</a></nav>
<section class="content">
<h2>大模块流程</h2>
<div class="flow">
<div class="step"><strong>配置目标</strong>provider_name/model/api_base/key</div><div class="arrow">-&gt;</div>
<div class="step"><strong>ProviderBundle</strong>main/auxiliary/embedding</div><div class="arrow">-&gt;</div>
<div class="step"><strong>Provider.chat</strong>统一入参</div><div class="arrow">-&gt;</div>
<div class="step"><strong>协议转换</strong>system/tool/reasoning/usage</div><div class="arrow">-&gt;</div>
<div class="step"><strong>LLMResponse</strong>content/tool_calls/finish_reason</div>
</div>
<h2>小模块拆分</h2>
<article class="module">
<h3>base models</h3>
<p><code>LLMProvider</code> 定义 chat 协议;<code>LLMResponse</code> 统一模型输出;<code>ToolCallRequest</code> 统一工具调用 id/name/arguments。</p>
<div class="subflow">
<div>AgentLoop 只消费 LLMResponse不关心具体 SDK。</div>
<div>Tool call arguments 被规范化为字符串或 dict 后交给 ToolExecutor。</div>
<div>usage 被映射回 session usage。</div>
</div>
</article>
<article class="module">
<h3>factory / runtime / registry</h3>
<p>根据配置创建 provider runtime并组织 main provider、auxiliary provider 和 embedding runtime。Router、Planner、Validator 和 Skill 选择通常使用 auxiliary provider主回答使用 main provider。</p>
<div class="subflow">
<div>resolve provider target。</div>
<div>创建 runtime带 api key/base/header/timeout/model。</div>
<div>创建 ProviderBundle供一次 Task attempt 复用。</div>
</div>
</article>
<article class="module">
<h3>LiteLLM / OpenAI-like</h3>
<p>主要走 OpenAI 风格 messages + tools。它最接近 Beaver 内部协议,转换成本最低。</p>
<div class="subflow">
<div>接收 ContextBuilder messages。</div>
<div>附加 tools、max_tokens、temperature、thinking_enabled。</div>
<div>解析 content、tool_calls、usage、finish_reason。</div>
</div>
</article>
<article class="module">
<h3>Anthropic 与 Codex</h3>
<p>这两类 provider 对 system prompt 有特殊要求,会把第一条 system message 提取到独立字段,剩余 messages 作为对话输入。Codex 还会使用 prompt cache key。</p>
<div class="subflow">
<div>扫描 messages提取第一条 system。</div>
<div>其余 system 或非 system message 按 provider 能接受的格式转换。</div>
<div>调用 provider SDK并把响应转回 LLMResponse。</div>
</div>
<p>Prompt 相关provider 本身不创造业务 prompt但会改变 system message 的传输位置,详见 <a href="prompt-atlas.html#provider-conversion">Prompt Atlas</a></p>
</article>
<article class="module">
<h3>fallback chain</h3>
<p>当主 provider 失败时fallback chain 可以尝试备用目标。上层仍看到统一的 LLMResponse。</p>
<div class="subflow">
<div>主 provider 调用失败。</div>
<div>记录异常并尝试 fallback target。</div>
<div>成功则返回 fallback response全部失败则 finish_reason/error。</div>
</div>
</article>
</section></main></body></html>