feat(engine): 添加运行时上下文支持并重构工具迭代限制

添加 RuntimeContext 类用于捕获模型运行时的日期时间信息,
包括UTC时间、本地时间和时区信息,并在系统提示中显示这些信息。

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

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

- 添加 RuntimeContext 类和相关渲染方法
- 增加 max_context_messages 和 max_tool_iterations 配置
- 移除 ValidationService 相关代码
- 更新消息记录中的验证状态字段
- 添加原始工具调用检测和回退处理
This commit is contained in:
2026-05-26 11:18:35 +08:00
parent 16347caf5e
commit 6e9e74d1ee
57 changed files with 5710 additions and 1582 deletions

View File

@ -0,0 +1,68 @@
<!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>