> ## Documentation Index
> Fetch the complete documentation index at: https://docs.fim.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# 更新日志

> FIM One的所有重要更新。

本项目的所有重要更新都记录在此。

格式遵循[Keep a Changelog](https://keepachangelog.com/)。版本对应于[路线图](/roadmap)里程碑。

## \[未发布]

### 已修复

* **刷新令牌轮换现在真正使先前的令牌失效。** JWT `exp` 仅精确到秒，因此同一用户在同一秒内颁发的两个刷新令牌曾编码相同——轮换会用相同值重写存储的哈希，被盗的刷新令牌可以永久续期。每个刷新令牌现在都携带唯一的 `jti`，因此轮换后的令牌不同，旧令牌立即停止工作。

* **审批闸门现在在通过另一个智能体或工作流到达智能体时保持有效。** 敏感连接器调用在聊天中会要求确认，但之前通过 `call_agent` 委派或包装在工作流 `AGENT` 节点中时会无检查地运行——这些路径启动智能体时完全没有钩子。现在两者都会运行智能体自己的闸门，使用该智能体的确认设置，如果其钩子无法加载则拒绝运行。

* **`SMTP_SSL` 中的拼写错误不再默默地以明文发送你的 SMTP 密码。** 之前任何除 `ssl` 或 `tls` 以外的值（例如 `SMTP_SSL=true`）都会无警告地落入未加密连接，包括系统邮件和邮件通知。现在无法识别的值会被直接拒绝，未加密传输必须显式请求为 `SMTP_SSL=none`，这会在每次发送时记录警告。

### 已移除

* **README Star History 图表及其刷新工作流。** 在 GitHub 限制了 stargazers API（2026年7月）后，维护自有图表需要一个长期有效的管理员 PAT，该 PAT 不断过期导致定时任务失败。该图表、SVG 资源、生成器脚本和 `Star History` GitHub Actions 工作流已被移除。

* **升级时回收之前共享给组织的知识库。** v0.8.9 中保持已发布知识库对其订阅者可达的特殊处理已被移除：每个共享的知识库都会恢复为个人知识库，其订阅被移除，剩余的取消发布操作和订阅者面向的知识库徽章也消失。现在知识库只能通过共享的智能体才能被其他用户访问，由所有者在运行时委托其内容。

## \[v0.8.9] - 2026-07-08

### 新增

* **技能和工作流现已成为可选模块，默认关闭。** 新安装仅启动核心功能（聊天、智能体、知识库、连接器）；管理员可从"管理员 → 设置 → 模块"打开技能和/或工作流。模块关闭时，它会从导航和页面中隐藏，其API、市场条目和触发器不可用——不会删除任何内容，重新打开时一切恢复。

* **DAG重新规划不再重做已完成的工作，中断的运行可从中断处恢复。** 当计划需要修订时，已完成的步骤会连同其结果一起纳入新计划——仅剩余工作被重新规划和执行。步骤进度也会实时检查点保存，因此如果运行在执行中被中断（崩溃、部署、连接断开），重试同一请求会从已完成的步骤继续，而不是重新开始。

* **慢速工具现可在后台运行而不阻塞智能体。** 沙箱代码执行（Python/Shell/Node）提供 `run_in_background` 选项：智能体立即获得任务ID，继续处理其他步骤，工具完成时以通知形式接收结果。如果智能体在任务仍在运行时尝试完成，它会等待（有界限）并在回答前合并其结果。

* **对话历史在压缩前已快照保存，预算截断的工具结果保存到工作区。** 在长对话压缩用摘要替换历史之前，完整记录被写入对话工作区作为JSONL文件；同样，被聚合令牌预算截断的工具结果完整保存到工作区并在原位置留下指针——在两种情况下，智能体（和你）都可以读回原始内容而不会丢失。

* **当模型达到输出限制时，答案不再中途截断。** 当响应被提供商的输出令牌上限截断时，智能体自动要求模型从停止处继续（最多3轮）并将片段拼接成一个无缝答案——在推理循环和流式最终答案中都适用。

* **LLM调用现在在提供商过载（HTTP 529）和网关超时（504）时重试，并遵守 `Retry-After`。** 之前来自Anthropic的529会立即失败请求，除非配置了备用模型；现在它会退避并像429/5xx一样重试，当存在 `Retry-After` 头时精确等待提供商指定的时间。

* **智能体现在在多步任务中保持可见的计划。** ReAct智能体获得 `update_plan` 工具来将计划写成待办事项清单并随着进度更新；如果计划在多个工具调用后变得陈旧，完整清单会被重新注入作为提醒——因此长任务即使在上下文压缩后也能保持目标。默认启用（`REACT_PLAN_TOOL_ENABLED`）；DAG子步骤和无工具智能体跳过此功能。

* **智能体现可在对话中途运行工作流。** 你拥有或已订阅的活跃、无需人工审批的工作流作为 `run_workflow` 工具提供给智能体——在普通聊天和选定智能体时都可用——因此任务可将确定性、可重复的子流程交给工作流并获取其输出。每次这样的运行都记录在工作流的运行历史中，其令牌使用计入工作流所有者的配额（如果所有者已超配额则拒绝运行）。带有"人工干预"步骤的工作流保持仅触发模式（从工作流页面或其API密钥），因为它们可能长时间阻塞。

* **两个新的工作流启动模板：连接器操作和MCP工具调用。** "从模板创建"库现在展示连接器和MCP节点——调用外部系统或MCP工具，然后用LLM总结结果。创建后选择特定的连接器/服务器。

### 变更

* **知识库不再可共享。** 已移除将知识库发布到组织或市场的功能；知识库仅通过绑定到共享的智能体来被其他人访问，由所有者在运行时委派其内容。任何已发布的知识库仍可被其当前订阅者访问，并可从其菜单恢复为个人知识库。
* **连接器和MCP服务器不再默认共享所有者的凭证（破坏性变更）。** "允许回退到所有者的凭证"现在是可选的：新建的连接器/MCP服务器默认关闭此功能，所有现有的连接器/MCP服务器也已关闭。依赖所有者令牌使用共享连接器或MCP服务器的订阅者现在需要添加自己的凭证，或者所有者必须在该资源上重新启用回退。无论此设置如何，所有者始终可以使用自己的凭证。因此，回退关闭且您没有凭证的连接器现在会从智能体的工具集中隐藏（与MCP服务器的现有行为一致），而不是被提供然后在调用时失败。
* **新智能体现在默认使用ReAct执行而非Auto。** Auto模式每个请求需要额外调用一次快速模型来决定使用ReAct还是DAG；新智能体（以及内置/市场模板）现在默认使用ReAct，消除了每条消息的延迟和成本。Auto和DAG仍可按智能体选择；现有智能体保持其当前模式。
* **AI智能体创建可从较弱的快速模型恢复。** 从自然语言指令构建或优化智能体在快速模型上运行；如果无法生成有效配置，请求现在会在更强的通用模型上重试一次，然后再报错，因此过弱的快速模型不再会导致用户看到失败。

### 已移除

* **精简了可视化工作流构建器至9个核心节点类型。** 移除了16个很少使用的实用工具和控制流节点——环境变量、HTTP请求、代码执行、迭代器/循环、子工作流、模板/列表/转换辅助工具，以及参数/问题提取器和分类器——使构建器专注于编排智能体、连接器、MCP服务器和知识库。作为副作用，共享工作流不再包含嵌入式密钥：现在它纯粹是一个引用图，每个被引用的资源在运行时强制执行自己的按用户访问控制。基于已移除节点构建的现有工作流需要用剩余的节点集重新构建。

### 安全性

* **API密钥作用域现在按请求携带，而不是附加到用户对象。** 这关闭了一个潜在的作用域混淆路径，其中缓存或身份映射共享的用户可能会继承另一个身份验证上下文的作用域集。
* **自动创建的包含生成的JWT密钥的`.env`文件现在以仅所有者（0600）权限写入。** 预先存在的`.env`文件保持其权限。
* **密码哈希成本现在可通过`FIM_BCRYPT_COST`调整**（默认值12，限制在bcrypt的4–31范围内），供运维人员在硬件和加固需求之间平衡。
* **数据库连接器不再可以共享，其原始SQL工具仅限所有者使用。** 将数据库连接器发布到组织或全局现已被拒绝，任意SQL数据库工具仅向连接器所有者提供——永远不会提供给订阅者，无论所有者凭证回退设置如何。以前，共享数据库连接器会通过所有者（通常是高权限）数据库账户向任何订阅者公开无限制的SQL，没有按调用者的作用域限制。按用户作用域的数据库访问将通过未来的声明式操作层返回。
* **Webhook和定时触发的工作流现在计入所有者的令牌配额。** 通过其公共API密钥或按计划触发的无人值守工作流运行以前在执行LLM和智能体步骤时不检查或记录任何令牌使用，这是一条完全绕过配额的无计量免费LLM路径。此类运行现在在工作流所有者的配额前端受到限制（公共触发被拒绝，计划运行被跳过，当所有者已超过配额时），其令牌使用按运行记录并计入与聊天相同的月度配额。
* **飞书审批卡现在强制执行谁可以审批。** 卡片点击仅在点击者的飞书账户链接到FIM One用户且该用户实际被允许在智能体的审批人作用域设置下审批时才被接受（发起人、智能体所有者或组织成员）——这与门户内审批已应用的规则相同。以前，飞书群组中的任何人都可以审批或拒绝待处理操作，决定被记录而没有身份。
* **飞书通道现在需要加密密钥，没有有效签名的回调被拒绝。** 当未配置加密密钥时，回调签名验证失败关闭（以前它接受未签名的回调，所以任何了解通道回调URL的人都可以伪造审批），飞书在启用加密时发送的加密事件信封现在被解密。新建和编辑的飞书通道必须提供加密密钥。
* **审批请求不再被路由到意外的聊天。** 当智能体没有明确配置审批通道时，待处理审批可能被推送到智能体的完成通知通道，或者如果失败，被推送到组织中的第一个通道——将敏感操作卡暴露给从未被选为审批人的群组。审批现在仅发送到智能体的明确配置的审批通道，否则回退到门户内审批。
* **共享MCP服务器和知识库在运行时重新检查访问权限，而不仅仅在绑定时。** 工作流MCP步骤、智能体的绑定MCP服务器或智能体的绑定知识库现在在每次运行时针对当前订阅状态进行验证，因此通过离开组织撤销的访问权限立即生效，而不是通过陈旧的绑定继续存在。

### 已修复

* **OAuth登录现在在GitHub/Google/Discord/Feishu响应缓慢时快速失败并显示清晰的"提供商响应超时"消息**，而不是挂起在库默认超时上并显示通用错误。
* **智能体在被要求重新设计HTML可交付物时不再生成虚假图像，也不再声称创建了文件而实际上没有写入工作区。** 图像生成现在明确限制为光栅图片，文件可交付物必须通过工具调用写入——在聊天中粘贴内容不再算作"生成文件"。
* **生成的HTML页面现在默认使用温暖的Claude启发调色板，而不是通用的紫色渐变外观。** 当你不指定样式时，智能体使用温暖的最小基线；你指定的样式始终优先。
* **冗长的工具密集型对话在历史压缩时不再中断。** 上下文压缩可能会切断工具调用和其结果之间的保留窗口，产生LLM提供商拒绝的消息序列（HTTP 400）——恰好在最需要压缩的长运行中。压缩器现在在保留端将每个工具调用与其结果保持在一起。
* **后台工具结果现在显示在步骤流和DAG证据中。** 在后台运行的工具调用过去只在智能体的内部通知消息中传递其真实输出——UI的步骤时间线和DAG答案验证证据只看到调度占位符。现在将清空的结果作为真实工具名称下的正常工具完成事件发出。
* **包含重复步骤ID的罕见规划器输出不再导致整个DAG轮次失败。** 重复ID过去被误诊为"循环依赖"错误；现在它们被确定性地重命名，计划继续进行。
* **多个ReAct循环正确性修复。** 返回空输出的工具在启用工作区时保留其"完成但无输出"注记而不是空结果；被不可满足的依赖阻止的DAG步骤现在发出适当的终端事件而不是让UI挂起；对于没有原生工具调用的模型，回退答案合成现在看到工具结果，而不仅仅是工具调用。
* **对话工作区现在实际上连接到聊天中——超大工具结果可恢复而不是无声丢失。** 智能体层的工作区恢复路径（带有`workspace://`指针的大输出卸载、预算截断工具结果的完整副本救援、压缩前的记录快照）存在，但聊天端点从未创建工作区，所以它们都没有运行：一旦工具结果预算耗尽，模型收到空观察且无法读取数据，并从猜测中回答。ReAct和DAG步骤智能体现在获得每次对话的工作区，删除对话会清理其工作区文件和任何剩余的崩溃恢复检查点。
* **恢复的DAG运行不再丢失长步骤输出的末尾。** 存储在崩溃恢复检查点中的步骤证据在大小上限处仅从头部切割，无声地丢弃输出末尾的任何内容——这正是结论、校验和和最后行所在的位置。现在上限证据保留头部和尾部，中间有明确的省略标记。
* **智能体不再通过Python打印自己的笔记来"工作"。** 鼓励为每个工具调用编写一个综合脚本的效率指导现在限制在真正需要代码执行的任务——知识问题、比较和模型可以直接生成的分析直接回答，而不是通过无意义的沙箱脚本路由。
* **工作流内的智能体步骤现在运行完整的智能体，而不仅仅是其提示。** 工作流的Agent节点过去仅使用智能体的指令在通用模型和默认工具集上执行——无声地丢弃智能体的连接器、知识库、MCP服务器和配置的模型。现在它完全按照在聊天中的方式运行智能体，具有所有绑定的资源和模型，且仅当该智能体对工作流所有者可见时。
* **离开（或被移除出）组织现在撤销其共享访问权限。** 你只能通过该组织访问的资源被取消订阅，你为其保存的每用户连接器/MCP凭证被删除——所以你不再能使用这些资源或在离开后回退到所有者的凭证。通过市场订阅的资源不受影响。
* **删除账户现在一致地删除所有内容。** 管理员"删除用户"和自助"删除我的账户"路径过去会分叉——每个清理不同的磁盘文件集（两个都错误地计算其文件路径，所以每个都无声地遗漏了一些），管理员路径留下了API密钥、登录历史、评估数据、调用日志和订阅。现在两者都通过一个例程运行，该例程删除每条记录和文件，删除不再在强制执行外键的数据库上失败。
* **仍然拥有组织的用户不再能被删除。** 请求现在被拒绝并显示清晰的消息以转移所有权（或先删除组织），而不是失败不清楚或留下孤立的组织。
* **删除智能体不再破坏过去的对话。** 引用该智能体的对话被保留为历史记录，只是清除了智能体链接，而不是阻止删除。
* **需要确认的连接器操作不再能在工作流中无人值守运行。** 标记为需要确认的连接器操作过去在工作流内执行时审批闸门被无声绕过。步骤现在以失败关闭并显示消息以在其前放置Human Intervention节点（工作流原生审批闸门）或使用不需要确认的操作。
* **工作流步骤不再借用所有者的MCP凭证。** 当工作流的MCP服务器禁用了所有者凭证回退时，非所有者运行该工作流无声地回退到所有者的服务器凭证而不是被停止。步骤现在以清晰的消息失败以配置你自己的凭证，与聊天路径匹配。
* **从工作流进行的连接器调用现在被审计记录。** 在工作流内运行的连接器操作在连接器调用日志中没有留下条目（仅记录聊天启动的调用）；工作流调用现在写入相同的审计跟踪。
* **你现在可以将订阅的连接器、知识库或MCP服务器附加到智能体。** 绑定过去需要你*拥有*资源，所以你合法订阅的连接器（组织共享或市场安装）被拒绝为"未拥有"。绑定现在遵循应用其余部分使用的相同可见性规则——你拥有或订阅的任何东西都是可绑定的。
* **工作流步骤只能调用你实际有权访问的连接器。** 工作流的连接器步骤过去运行任何其ID引用的连接器，只要该连接器存在；现在它强制执行运行者的可见性（拥有或订阅），所以共享工作流不能仅通过引用其ID来访问你无权访问的连接器。
* **知识库搜索现在针对你订阅的KB工作，而不仅仅是你拥有的KB。** KB的数据存储在其所有者的存储下，但工作流知识库步骤（和没有智能体的知识库聊天）过去在调用者自己的存储下查找——所以搜索与你共享的KB无声地返回无结果。所有者现在从KB本身解析，搜索被访问检查（所有者或订阅者），所以共享KB返回结果，你看不到的KB返回无结果而不是令人困惑的空命中。
* **后台作业不再随机消失。** 文档摄取、webhook传递、评估运行和响应后通知被启动为火即忘任务，运行时仅弱引用，所以在负载下它们可能被垃圾回收中途并无声停止。现在它们被保留直到完成（并记录其失败），所以它们可靠地完成。
* **大文件上传不再阻止其他请求。** 从上传的PDF/DOCX进行的文本提取在主事件循环上同步运行，在解析大文件时短暂冻结所有并发请求。提取现在卸载到工作线程。
* **多步骤（DAG）答案不再误表其来源。** 当计划的研究步骤获取页面并总结它时，仅该摘要向前流动——所以列出11项的来源可能在最终答案中显示为6项，或项目的严重性可能被错误标记，目标评估步骤无法捕获它因为它从未看到原始来源。每个步骤现在保留其原始工具输出作为权威来源证据，最终合成和评估者根据其检查答案，所以总数、枚举和属性与来源实际说的相匹配（当它们不匹配时信心下降并带有命名的差异）。
* **工作流LLM节点不再显示没有意义的模型控制。** 它有一个硬编码的模型下拉菜单，其选择在运行时被忽略，加上一个Fast/Main层级切换暴露内部（自动降级）概念。两者都被移除——节点现在始终运行你的系统配置模型（Model Provider，回退到`.env`），与playground解析它的方式相同，带有一行注记指向配置模型的位置。
* **智能体编辑器在没有编辑任何内容时不再警告未保存的更改，保存不再因审批人范围错误而失败。** 打开智能体并离开可能触发虚假的"未保存更改"对话框，保存具有遗留审批人范围值的智能体可能被直接拒绝——两者都追踪到同一字段被不一致地读取。编辑器现在在加载时规范化这些字段，所以脏检查是准确的，陈旧的存储值被更正而不是回显。

## \[v0.8.8] - 2026-06-22

### 已更改

* **智能体现在更干净地承认错误。** 当工具结果与智能体之前说的内容相矛盾时，它会在同一轮中承认并更正，不会过度道歉或用自我批评填充回复。

### 安全性

* **阻止了通过IPv4映射IPv6地址的SSRF绕过。** 一个主机为IPv4映射IPv6字面量的URL（例如 `http://[::ffff:169.254.169.254]/`）绕过了私有IP阻止列表，可以在双栈主机上访问内部服务——包括云实例元数据。这些地址现在会被解包并针对IPv4阻止列表进行检查，关闭了每个SSRF保护路径上的漏洞（网页获取、HTTP工具、连接器、RAG导入器）。
* **MCP SSE / Streamable-HTTP服务器URL现在进行SSRF验证。** 经过身份验证的用户可以将MCP服务器指向内部地址，并在测试或连接服务器时触发对其的请求。服务器URL现在在创建/更新时以及连接时再次进行验证。
* **Docker Compose PostgreSQL凭证现在可通过 `POSTGRES_USER` / `POSTGRES_PASSWORD` / `POSTGRES_DB` 覆盖。** 之前硬编码的 `fim:fim` 默认值现在单一来源（连接字符串从相同变量派生），并附带警告文档说明在暴露数据库前应更改它，因此操作人员不再会意外地发布默认管理员凭证。

### 已修复

* **LLM 访问在静默期后不再断开连接。** 共享 HTTP 连接池在启动时安装一次并为每次模型调用重复使用；系统空闲后，底层客户端可能被关闭，之后每次 LLM 调用都会因连接错误而失败，直到服务重启。连接池现在在每次调用前重新验证并透明地重建，因此服务可以自动恢复，无需重启。
* **在聊天中发送消息现在立即流式传输，而不是卡顿。** 每次发送过去都会在答案开始前阻塞以完整重新加载对话历史，因此较长的聊天会短暂冻结，并在每轮都重新获取整个记录。已完成的轮次现在在后台折叠到历史中，因此发送立即流式传输并跳过冗余的重新加载。
* **扩展思考现在适用于较新的 Anthropic 模型（Opus 4.6+、Sonnet 4.6、Fable 5）。** 这些模型移除了旧的固定预算思考参数——Opus 4.7/4.8 和 Fable 5 会以 400 错误拒绝它——因此配置推理工作量要么出错，要么无声地什么都不做。我们现在为这些模型发送自适应思考协议（并删除它们不再接受的采样参数），因此推理工作量正确生效。使用自适应思考但通过通用 OpenAI 兼容代理连接的模型（其中无法启用思考）现在会记录清晰的警告，而不是无声地失败——将其配置为 Anthropic 提供商以启用思考。
* **强制登出现在在 PostgreSQL 上正确比较时间戳。** 会话失效检查假设存储的失效时间是朴素 UTC，并强制将其作为 UTC，这无声地破坏了与 PostgreSQL 可能返回的时区感知非 UTC 值的比较。时间戳现在通过转换而不是覆盖来规范化为 UTC，因此撤销的令牌在每个后端都可靠地被拒绝。
* **执行钩子在崩溃时现在故障关闭。** 引发异常的 `PRE_TOOL_USE` 钩子（例如审批闸门）以前返回 `allow=True`，因此被阻止的工具调用仍会继续——崩溃的闸门无声地变成了旁路。PRE 钩子现在在出错时默认拒绝；非执行钩子（速率限制器、日志记录器）通过新的 `fail_open` 标志保持旧的故障开放行为。
* **智能体答案不再丢弃推理的结论。** 当推理模型已经生成最终答案时，管道进行第二次有损合成调用，可能丢弃模型自己的结论——当对话被压缩、防止上下文限制或通过多步计划路由时，推理细节进一步丢失。循环现在逐字流式传输其真正的最终答案，推理通过压缩、上下文重建和子智能体步骤进行，因此你看到的答案反映完整的思考链，而不是淡化的重述。

## \[v0.8.7] - 2026-06-10

### 安全性

* **修复了双因素认证绕过漏洞。** API 和聊天/SSE 认证现在需要真正的访问令牌（SSE 流式传输也接受其短期有效的票证）；2FA 临时令牌、刷新令牌和绑定/SSE 票证——所有这些都用同一密钥签名——不再能被重放用于认证，因此仅盗取密码无法跳过第二因素。
* **OAuth 登录不再在未验证的电子邮件上自动关联到现有账户。** 第三方账户仅在提供商标记该电子邮件已验证时才通过电子邮件与本地账户匹配，防止通过攻击者控制的未验证地址进行接管。

### 已添加

* **`file_ops.apply_patch` — 对文件应用V4A格式的diff补丁。** 允许智能体通过基于行的分块和模糊空格匹配进行多行编辑，补充现有的`find_replace`功能，适用于精确子字符串匹配不稳定的情况。
* **用于输入和输出验证的内容护栏。** 新增`core/agent/guardrail`层与现有工具权限闸门和安全检查并行运行（而非替代）。输入护栏（默认：越狱短语检测器）在任何LLM调用前运行，如触发则中止该轮次，节省令牌并在聊天中显示清晰的"已阻止"提示。输出护栏在最终答案后运行。可通过`FIM_GUARDRAILS_INPUT`/`FIM_GUARDRAILS_OUTPUT`环境变量配置；按智能体UI配置将在后续版本推出。

### Changed

* **`/settings?tab=billing` 现在以全宽渲染，与其他设置标签页在视觉上保持一致。** 移除了 `max-w-4xl` 宽度限制和冗余的外层滚动容器；删除了页面标题图标；将套餐/使用情况/订阅/套餐对比卡片改写为使用与"使用情况"标签页相同的精简边框div模式（紧凑标签 + `tabular-nums` 数字）。旧布局看起来像是一个独立页面被意外楔入了设置框架中。

### 已修复

* **代币配额现在在您的账单日期重置，而不是每月1日。** 使用情况始终按日历月计数，与您何时订阅无关，因此付费用户可能在20日被收费，却要等到1日才能获得新配额——在月底开始的订阅实际上会在几天后获得第二个完整配额。配额现在在每个订阅的月度周年日期重置（免费用户仍按日历月重置）。按年计费的套餐现在每月正确补充一次，而不是每年一次。"套餐与账单"选项卡、"使用情况"卡片和超配额对话框现在都在同一时间窗口内测量使用情况并显示重置日期，因此显示的"本期使用情况"与聊天实际停止您的时间点相匹配。
* **订阅续期现在推进账单周期。** 在自动续期时，显示的周期结束日期在之前的周期保持冻结，即使Stripe已收费并将订阅向前推进——续期处理程序仅从发票负载中读取新周期，该负载不可靠。现在它从Stripe检索权威的周期边界，因此周期结束日期（和配额重置）在每次续期时向前移动。这也消除了一个潜在风险，即取消此类订阅可能会立即降级账户，而不是在真正的周期结束时。
* **原始工具调用协议不再泄露到智能体答案中。** 当模型即兴创作工具调用作为纯文本时（例如发出 `<tool_call>`/`<tool_response>` 块——当它尝试使用不可用的工具时很常见），该文本——包括其中的任何base64/文件转储——可能会逐字出现在回复中。所有答案路径现在都会剥离此伪协议，解析器另外将 `{"name","arguments"}` 方言识别为真正的工具调用，而不是泄露它。
* **智能体轮次期间间歇性的 `APIConnectionError: Connection error` 突发。** 共享HTTP连接池为空闲保活连接保留最多30秒；当上游中继或NAT静默回收空闲连接时，下一个请求重用半死的套接字并失败。保活过期现在默认为短5秒（轮次内的热连接仍被重用），池可通过 `LLM_HTTP_MAX_CONNECTIONS` / `LLM_HTTP_MAX_KEEPALIVE` / `LLM_HTTP_KEEPALIVE_EXPIRY` 调整——设置 `LLM_HTTP_MAX_KEEPALIVE=0` 以在不可靠的上游后完全禁用连接重用。
* **API密钥使用统计（`total_requests`、`last_used_at`）现在在每个请求上持久化。** 以前增量是在请求的数据库会话上写入的，该会话仅由执行自己写入的端点提交——因此只读API密钥调用（仪表板、文件、模型、导出……）会静默回滚计数器。使用情况现在记录在独立的自提交会话上，与请求成功解耦。

## \[v0.8.6] - 2026-05-08

### 已添加

* **Stripe 计费——Pro 计划订阅。** `/settings?tab=billing` 下新增 `Plan & Billing` 标签页，显示当前计划、月度代币使用量、周期重置时间，以及 `Upgrade to Pro`（Stripe Checkout）或 `Manage subscription`（Customer Portal）。成功结账后打开带有购买计划名称的彩纸模态框；重定向参数仅在关闭后才会清除，因此刷新不会重新触发。配额强制执行遵循每个用户的计划；已取消的订阅在付费期结束前保持 Pro 状态；中途 402 配额对话框现在转到计费标签页。管理员在 Admin Panel → Billing 下管理计划和浏览订阅。Pro 目前使用 Stripe **test-mode** 价格；生产环境切换时替换价格 ID。
* **管理员控制的计费功能开关。** Admin → System Settings 中的 `Enable Stripe Billing` 开关控制整个 Stripe 管道——用户端 `/api/billing/*`、Stripe webhook、管理员计划/订阅 CRUD，以及前端计费标签页 + 管理员导航在关闭时隐藏或返回 503。首次激活时初始化 Free + Pro，设置 `default_plan_id` 指针，并回填 `users.plan_id`；后续关闭/打开为纯开关切换。没有 Stripe 凭证的私有部署保持干净状态。当计费关闭时，配额链回退到管理员设置的 `Default Monthly Token Quota`。
* **按用户无限配额 + Registered 列。** 空配额字段继承全局限制；`0` 授予无限。之前两者折叠为同一状态。用户表还新增了 Registered 列。
* \*\*非英文文档（`zh` / `ja` / `ko` / `de` / `fr`）现在显示完整的 API Reference 和 Channels Configuration 部分——`Endpoints` 组和 `Configuration > Channels` 子组之前仅提供英文版本。

### 已变更

* **`Plan & Billing`现在是Settings标签页，而非独立页面。** 将`/settings/billing`折叠回`/settings?tab=billing`，使用户在切换套餐时左侧导航保持可见（与GitHub / Linear / Notion一致）。独立路由会重定向，因此旧书签和早期部署的Stripe Checkout返回URL继续有效。`Subscriptions`标签页已重命名为`Marketplace`以区分套餐订阅。
* **免费套餐配额在管理员Plans页面上为只读。** 数据来自System Settings → Default Monthly Token Quota；在该处编辑会自动传播。后端对免费套餐的PATCH请求会静默忽略`monthly_token_quota`。
* **Token配额在计费页面、套餐卡片和管理员Plans表格中显示为`5M` / `100K`** 而非`5,000,000`。管理员INPUT字段仍接受原始数字。
* **翻译权限从各语言环境文件转移到单一词汇表。** 规则存放在[`scripts/translation-glossary.md`](https://github.com/fim-ai/fim-one/blob/master/scripts/translation-glossary.md)中，加载到每个LLM翻译调用（JSON、MDX、README）。预提交钩子无条件拒绝对生成的语言环境文件的手动编辑。要修复翻译错误，请编辑词汇表并使用`--force`重新生成。
* **许可方和管辖法律。** FIM One Source Available License现由**FIM Labs Pte. Ltd.**（新加坡）授予；管辖法律从中国转移至新加坡；争议由新加坡SIAC仲裁解决（单仲裁员，英文）。新增顶级`NOTICE`文件记录研发归属、商标和第三方组件政策。许可使用和限制条款无变更。

### 已修复

* **管理员对智能体、连接器、知识库和MCP服务器的批准/拒绝操作在PostgreSQL上不再失败。** publish-review `reviewed_at` 列现已具有时区感知能力，因此在PG上的批准写入操作成功（该bug在SQLite开发数据库上不可见）。
* **OAuth用户可以再次刷新其会话。** OAuth颁发的刷新令牌以刷新端点无法匹配的形式存储，导致访问令牌过期后必须重新登录；现在它以与其他路径相同的摘要形式存储。
* **浏览器标签页标题现在反映`/settings`和`/admin`中的活跃子标签页**（例如`Settings · Billing — FIM One`），因此多个固定标签页可以区分。
* **使用情况页面在管理员设置了默认令牌配额时不再显示"无限制"** ——现在通过统一配额链解析（按用户覆盖→计划层级→系统默认值）。
* **智能体设置：绑定资源在进入时不再闪烁显示为"(已删除)"。** 孤立徽章在库存获取稳定后再渲染。
* **Toast通知现在遵循浅色/深色主题**，而不是硬编码为深色。
* **按智能体的使用情况分解不再为与已删除智能体关联的对话重复显示"直接聊天"行。**
* **自托管`./deploy.sh`不再因`container name already in use`而失败** ——在`docker compose up`前清理哈希前缀的僵尸容器和DooD沙箱子进程。
* **推送后不再出现冗余的`chore(i18n): sync translations`提交** ——预提交翻译钩子现在将`.translation-cache.json`与翻译文件一起暂存。
* **当确认必需的工具在未绑定智能体的会话中运行时，智能体聊天不再崩溃** ——当没有智能体可路由时，闸门优雅地退出。
* **在严格交替提供商（Claude）上重试不再因历史记录中来自已停止轮次的孤立用户消息而失败** ——相同角色的连续消息在分派前折叠为单个轮次。
* **演练场重试在流前窗口期间不再短暂显示查询两次。**
* **ReAct智能体现在在操作员拒绝批准请求后确认并停止**，而不是重试改述的工具调用。
* **演练场"建议后续问题"返回并现在按智能体选择加入**（默认关闭；智能体设置中新增`Follow-up Suggestions`切换）。

## \[v0.8.5] - 2026-04-23

### 新增

* **贡献者友好的国际化工作流**：贡献者不再需要配置 `LLM_API_KEY` 来提交涉及英文源文件的PR。如果跳过本地预提交翻译步骤（无密钥），新的 `.github/workflows/i18n-sync.yml` 工作流会在PR合并后在 `master` 上将EN翻译为ZH/JA/KO/DE/FR，并自动提交结果。预提交钩子现在还会拒绝对生成的语言环境文件进行手动编辑（可使用 `ALLOW_LOCALE_EDIT=1` 覆盖以进行合法翻译修复），防止EN源和翻译输出之间的静默漂移。

* **国际化CI回退端到端验证**：烟雾测试推送（仅EN，本地翻译钩子跳过）确认GitHub Actions工作流检测到更改的源，翻译为所有五种语言环境，并使用 `[skip ci]` 自动提交到master以防止递归。

* **Exa集成文档页面**：侧边栏中的专用集成部分，包含一流的Exa页面，涵盖完整的Exa搜索表面（neural/fast/deep-reasoning/instant）、过滤、内容检索和三个针对新闻监控、研究论文检索和深度推理智能体的调优预设。作为Exa集成目录的合作伙伴面向的登陆页面。

* **信创数据库支持**：数据库连接器现在列出KingbaseES（人大金仓）、HighGo（瀚高）和DM8（达梦），与PostgreSQL/MySQL并列。KingbaseES和HighGo与PG兼容，使用 `asyncpg` 无需额外依赖；DM8使用官方 `dmPython` 供应商wheel。独立的 `scripts/test_xinchuang_dbs.py` 让运维人员可从CLI验证实时连接。

* **飞书通道+通过IM的确认闸门**：新的 `Channel` 资源类型（组织范围，凭证静态加密）让组织连接飞书应用以进行出站消息传递。标记为 `requires_confirmation=True` 的工具现在会向配置的飞书群组发送Approve/Reject交互卡片，而不仅在门户中显示确认对话框——群组中的任何授权成员都可直接从飞书批准或拒绝。涵盖设置→通道管理UI（列表、创建/编辑含脏状态保护、详情含可复制回调URL、测试发送）、CRUD API（`/api/channels`）和飞书事件回调端点（`/api/channels/{id}/callback`）含签名验证和URL挑战支持。v0.9 IM通道集成路线图项的第一步，提前于2026-04-24路演发布。

* **智能体钩子系统（骨架）**：`src/fim_one/core/hooks/` 中的新 `PreToolUseHook`/`PostToolUseHook` 抽象让确定性逻辑在LLM循环外运行——FeishuGateHook是第一个具体实现，附加到确认闸门流。完整钩子生命周期+用户定义的YAML钩子仍在v0.9范围内。

* **钩子系统现已在ReAct和DAG运行时中运行**：在其 `model_config_json` 中声明 `hooks.class_hooks` 的智能体在每个聊天会话上都会实例化并注册这些钩子。第一个消费者——`FeishuGateHook`——在智能体调用其连接器操作标记为 `requires_confirmation=True` 的工具时自动触发，向组织的飞书群组发送Approve/Reject卡片，阻止工具，并根据判决恢复或中止。之前钩子抽象已就位，但网络层中没有任何东西将其连接到实时聊天。

* **通道和钩子系统架构已文档化**：新的 `docs/architecture/hook-system.mdx` 解释了三个钩子点、为什么钩子在LLM循环外运行，并端到端演示FeishuGateHook。现有架构页面（system-overview、organization、react-engine、philosophy）交叉链接到它。README现在将消息通道列为一流的v0.8功能，应用层图包括IM目标与Portal/API/iframe并列。

* **钩子审批演练场**：通道详情表现在有"测试审批流"操作，模拟敏感工具调用，向关联的飞书群组推送真实确认卡片，并实时轮询审查者的决定。与现有预览按钮不同，这执行完整的生产路径（真实 `ConfirmationRequest` 行、真实飞书回调、状态转换），因此演示和预发布排练使用与生产钩子相同的代码路径。

* **每个智能体的任务完成通知**：智能体现在可在长时间运行的ReAct或DAG任务完成时向组织的通道（当前为飞书）推送摘要卡片。在设置→智能体→通知中按智能体配置。通用出站通知模式的第一个消费者。

* **可配置的确认闸门——内联*或*通道**：每个智能体现在在设置中都有"审批"部分，包含三种路由模式（自动/仅内联/仅通道）、审批人范围选择器（发起人/智能体所有者/组织中的任何人）、"每个工具调用都需要确认"覆盖和显式审批通道选择器。自动模式在存在关联通道时使用它，并优雅地回退到聊天流中的内联审批卡片——因此没有任何通道的智能体仍获得真实审批UX而不是静默失败。新的 `POST /api/confirmations/{id}/respond` 端点与飞书webhook共享单一决策记录路径，因此每个审批——无论是在聊天中点击还是在飞书群组中点击——都会标记相同的 `approver_user_id` 和 `decided_at` 审计字段。

### 已更改

* 演练场加载指示器现在使用细微的文本shimmer效果，而不是8秒后冻结在伪满宽度的不逼真进度条。将两个现有的shimmer实现（`.shiny-text`和`.text-shimmer`）统一为单个主题感知的原始组件，带有可选的warm预设。
* 连接器卡片现在在连接器禁用`allow_fallback`时显示"Private default"徽章（带工具提示），以便所有者一目了然地识别哪些连接器要求每个用户提供自己的凭证。连接器设置表单中Allow-Fallback切换下的帮助文本也澄清了该标志仅限制与其他用户的共享——所有者始终可以使用自己的默认凭证，无论如何。

### 已修复

* 连接器所有者使用`allow_fallback=false`且仅有默认凭证（无按用户凭证）进行的连接器调用不再返回401"需要身份验证"错误。所有者现已豁免于回退闸门——该标志仅控制*其他*用户是否可以借用所有者的默认凭证。之前所有者自己的智能体在无声地发送未认证请求，同样的问题也影响了工作流`connector_action`节点。
* 对话导出现在为自动路由的DAG对话显示正确的模式标签（"Planner"/"规划"），而不是始终显示"Standard"。
* 导出时间戳现在遵循用户配置的时区，而不是显示原始UTC。
* 上传的文件内容不再泄露到导出的对话中；仅包含用户的消息文本。
* 当提供商为每个流式工具调用增量重复使用`index=0`时，并行工具调用不再发生碰撞；聚合器现在通过id或名称变化检测边界，并将后续增量重新映射到正确的槽位。
* 设置→通道现在反映当前用户的组织角色：成员（非管理员/所有者）看到禁用的"新建通道"按钮、隐藏的编辑/启用-禁用/删除操作、只读横幅和权限感知的空状态——而不是提交时失败并显示"需要组织管理员访问权限"的启用CTA。
* 会话过期重定向现在保留查询字符串，因此用户重新认证后会回到他们正在查看的确切标签/筛选器，而不是裸路径。
* Feishu通道表单在与分层在对话框上方的聊天选择器交互时不再显示虚假的"放弃未保存更改"提示。
* 当UI本身已是中文时，Feishu通道设置提示不再重复中文标签（例如之前渲染为"事件与回调（事件与回调）"）。
* 架构管理器中的"全部标注"不再返回500内部服务器错误——完整标注后端路径存在未绑定变量错误，阻止了每次调用。
* 编辑数据库连接器现在在密码字段中显示`********`占位符，而不是三个项目符号掩码文本，使得显而易见留空字段会保留存储的密码。
* 更新连接器操作不再折叠详情面板——已编辑的操作保持选中状态，用户可以继续对其进行迭代。
* AI连接器编辑器现在区分成功、部分失败和完全失败，而不是对所有三种情况显示相同的"已完成"消息。失败原因内联显示，用户可以看到实际出错的地方。
* AI连接器编辑器不再能一次无声地清除多个操作。批量删除（>2个操作）现在需要用户指令中的显式破坏性关键字（"rebuild"、"全部重建"、"wipe"等）；否则操作被拒绝并显示清晰的错误，保护`requires_confirmation`/JMESPath设置免受意外丢失。
* 门户聊天中的确认卡现在显示请求是否被路由到通道（例如Feishu）或内联处理，以及关于谁被允许审批的人类可读提示（发起者、智能体所有者或任何组织成员）。通道路由的请求还会生成内联待处理卡，用户不会疑惑通知是否真的被发送了。
* Feishu审批卡在第一次决定后变为只读：`/callback` webhook返回替换卡，其中删除了审批/拒绝按钮，标题着色为绿色（已批准）或红色（已拒绝），防止重复点击。从陈旧Feishu客户端到达的重复点击会收到"此请求已被批准/拒绝。"提示和已决定卡的新副本，使陈旧视图得以更新。
* 恢复了通道行和详情表上的纯"发送测试消息"操作。审批演练场执行完整的钩子往返，但仅通知通道（未连接审批钩子）仍需要快速凭证/连接性健全性检查，纯测试发送覆盖了这一点。
* 对同一Feishu审批卡的并发点击不再都能成功。`/callback`处理程序现在通过条件`UPDATE ... WHERE status='pending'`翻转`ConfirmationRequest`状态，并使用受影响的行数来决定哪个调用者"赢了"；之前两个并行请求都可能读取`pending`并竞争写入，可能导致同一行上先批准后拒绝。
* 待处理审批请求现在通过后台清理器在`CHANNEL_CONFIRMATION_TTL_MINUTES`（默认24小时）后自动过期。防止数天后的陈旧点击翻转已被拆除的智能体状态；对过期卡的下一次点击会收到灰色"已过期"已决定卡和"不再活跃"提示。
* 发送测试消息现在仅在通道详情表中传递纯文本通知（无审批/拒绝按钮）——不在行下拉菜单中。不打算使用审批钩子的用户不会被"测试"消息上的交互按钮困惑。审批往返测试仍可通过审批演练场按钮获得。
* 通道详情表更紧凑："如何完成设置"现在是默认折叠的可折叠部分（因此对已配置的通道不会主导表），外部填充已减少，使内容更靠近表边缘。
* Builder AI不再将掩码（`****`）凭证报告为缺失——它现在将其识别为已配置并跳过虚假的"凭证缺失"指导。
* 演练场智能体列表现在显示所有可访问的智能体，而不仅是已发布的，因此草稿智能体可以在不先发布的情况下进行测试。
* 聊天图像上传不再在格式错误的`data:` URL上崩溃流——MIME提取器现在安全地回退到`application/octet-stream`，而不是在生成中途引发IndexError。
* 演练场图像缩略图现在通过`AbortController`在卸载时取消飞行中的获取，避免陈旧的blob-URL分配和快速导航期间的浪费带宽。

## \[v0.8.4] - 2026-04-17

### 已添加

* 对话恢复：合成的tool\_result行现在在中断的轮次后持久化；客户端可以通过`POST /chat/resume`端点使用最后看到的游标恢复断开的SSE流。
* 演练场现在使用`/chat/resume`端点自动重新连接断开的SSE流，采用指数退避策略（最多3次尝试）；在恢复期间显示"重新连接中…"指示器。
* 提示词缓存可观测性：`cache_read_input_tokens`和`cache_creation_input_tokens`从LLM响应中捕获，按轮次在`TurnProfiler`中聚合，作为`turn_cache`摘要行（`read/create tokens + estimated savings`）记录，并在聊天`done_payload`中的新`cache`字段中显示。支持验证Anthropic提示词缓存是否真正命中，同时可用于检测API中继站是否遵守缓存折扣。

### 已更改

* 系统提示词现在使用带有Anthropic提示词缓存断点的记忆化分段注册表，在稳定前缀上实现缓存——对于Claude模型，每轮缓存前缀的令牌成本降低约60-80%。ReAct JSON模式、原生函数调用模式和合成都为支持缓存的提供商（Claude、Bedrock Anthropic、Vertex Claude）发出两条系统消息，并为其他所有提供商回退到单个连接消息。

### 已修复

* 思维/推理令牌现在在多轮对话中持久化——Anthropic `signature` 字段被捕获并根据API要求在每次回放。
* 提供商感知的推理回放策略：`reasoning_content`（来自DeepSeek-R1、Qwen QwQ、Gemini thinking、OpenAI o-series）不再回放给后续轮次中的非Anthropic提供商。之前该字段在 `ChatMessage.to_openai_dict()` 中被无条件序列化，这违反了提供商文档（DeepSeek和Qwen都明确文档化"不要在消息历史中发送 `reasoning_content` 回去"），并在每次多轮交换时无声地使其自动前缀/KV缓存失效。策略集中在 `core/prompt/reasoning.py` 中——Claude系列（包括Bedrock和Vertex代理）仍按要求回放思维块和签名。

## \[v0.8.3] - 2026-04-16

### 新增

* **`convert_to_markdown` 内置工具** — 新的通用智能体工具，可使用Microsoft的MarkItDown将任何文件、URL、YouTube链接或数据URI转换为干净的Markdown。支持PDF、Word（.docx）、Excel（.xlsx/.xls）、PowerPoint（.pptx）、HTML、JSON、CSV、XML、ZIP、EPUB、Outlook .msg、图像、音频（语音转文本）和YouTube转录。默认对所有智能体可用——与`web_fetch`同级。配置了视觉能力的LLM时，嵌入图像和扫描的PDF页面会通过官方`markitdown-ocr`插件自动进行OCR。此前此功能隐藏在后台RAG摄取管道中；现在智能体可在交互式对话路径中使用它。
* **通过`markitdown-ocr`进行文档OCR** — DOCX/XLSX/PPTX中的嵌入图像和扫描的PDF页面现在使用FIM One其余部分路由的同一视觉能力LLM进行OCR。适用于内置`convert_to_markdown`工具和RAG摄取管道，因此聊天时转换和知识库摄取对相同输入生成字节相同的Markdown。
* **文档OCR的通用视觉提供商支持** — 新的`LiteLLMOpenAIShim`鸭子类型将任何FIM One `OpenAICompatibleLLM`包装在openai SDK的`.chat.completions.create(...)`API形状中，然后通过`litellm.completion()`调度。MarkItDown（硬编码openai SDK表面）现在可以使用Anthropic Claude、Google Gemini、Azure、Bedrock和LiteLLM支持的任何其他提供商——FIM One中无需按提供商适配器代码。
* **视觉感知RAG摄取** — Office文档和扫描PDF的知识库上传现在解析工作区的默认视觉LLM（数据库优先，ENV回退）并将其传递给MarkItDown以在摄取期间进行OCR。零回归：当没有视觉能力模型可用时，摄取无声地回退到纯文本模式——完全是功能前的行为。
* **扩展的MarkItDown格式覆盖** — RAG现在通过MarkItDown的音频转录和outlook扩展原生摄取`.pdf`、`.msg`（Outlook）、`.epub`、`.mp3`、`.wav`和`.m4a`。YouTube URL通过`convert_to_markdown`经由`markitdown[youtube-transcription]`流动。
* **`LLM_SUPPORTS_VISION` 环境变量** — ENV模式文档OCR回退的可选退出（`=false`）。默认行为是乐观的（`true`），涵盖常见ENV设置（`gpt-4o`、`claude-3-5-sonnet`、`gemini-1.5-pro/flash`）。仅当ENV配置的`LLM_MODEL`不支持视觉时设置为`false`（例如`deepseek-v3`、`qwen-chat`、`llama-3.1`、`gpt-3.5-turbo`、`o1-mini`），以跳过每次文档上传时失败的视觉调用。当管理员策划的ModelGroup处于活动状态时完全忽略——可用时DB模式始终是真实来源。
* **轮级分析器** — 每个ReAct轮现在在单个结构化日志行中记录阶段级时序（`memory_load`、`compact`、`tool_schema_build`、`llm_first_token`、`llm_total`、`tool_exec`）。可通过`REACT_TURN_PROFILE_ENABLED`切换（默认：开启；设置为`false`以实现零开销无操作）。
* **结构化压缩工作卡** — 对话压缩现在将其自身的9部分markdown输出解析为类型化`WorkCard`并将新压缩合并到前一个中，因此来自长会话早期的错误和待处理任务在多个压缩轮中存活，而不是从头开始重新汇总。

### 已更改

* **按用户速率限制** — LLM 层速率限制器现在为每个用户维护单独的桶，而不是单个进程全局桶。防止一个噪声用户对同一工作进程上的所有其他用户进行限流。可通过 `LLM_RATE_LIMIT_PER_USER` 切换（默认：开启）。

### 已修复

* **悬挂的tool\_use恢复** — 在工具执行中断的对话（用户Stop、SSE断开连接、崩溃）之前会留下一个带有`tool_use`块且没有匹配`tool_result`的助手消息，导致下一轮与LLM API的不透明HTTP 400崩溃。`DbMemory.get_messages()`现在在读取路径上检测并修复这些悬挂块，使用合成的`[interrupted]` tool\_result。原始数据库日志不会被修改。
* **带有tool\_calls的空内容助手消息不再被丢弃** — DbMemory加载路径过滤器之前会静默丢弃任何内容为空的助手行。仅携带`tool_calls`、没有文本的原生函数调用中间体被清除。过滤器现在要求内容为空且没有`tool_calls`两个条件同时满足。

## \[v0.8.2] - 2026-04-10

### Added

* **Intelligent Document Processing (Vision-Aware)** — 基于模型能力的自适应文档处理。当目标LLM支持视觉能力（GPT-4o、Claude 3/4、Gemini）时，PDF页面被渲染为图像并通过视觉内容块发送，以获得完整的视觉保真度。仅文本模型回退到pdfplumber文本提取。两种模式：Vision和Text-only。可通过`DOCUMENT_PROCESSING_MODE`、`DOCUMENT_VISION_DPI`、`DOCUMENT_VISION_MAX_PAGES`环境变量配置。在Admin中提供按模型的`supports_vision`开关。
* **Document vision pipeline** — 聊天中上传的DOCX、PPTX和PDF文件现在会提取其嵌入图像，并在模型启用视觉功能时作为视觉内容发送给LLM。
* **Multi-turn vision persistence** — 来自上传文档和图像的视觉内容在对话轮次中持久化，因此模型在整个对话过程中保留视觉上下文。
* **Smart PDF processing** — 文本丰富的PDF页面分别提取文本和嵌入图像（节省token）。扫描或仅图像页面渲染为全页PNG以获得最大保真度。
* **Pre-built sandbox image** — `Dockerfile.sandbox`包含常见的数据科学包（pdfplumber、Pillow、pandas等），因此AI代码执行在`--network=none`容器中开箱即用。
* **Resource Fork completion** — 所有五种资源类型现在都支持fork：Agent、Connector、Workflow、MCP Server和Skill。KB fork已移除（本质上是用户本地的）。

### 更改

* **更快的聊天响应完成** — SSE流在智能体完成后立即关闭；标题生成和后续建议在后台运行，而不是阻塞响应。
* **更智能的上下文压缩** — 对话压缩使用结构化的9部分格式，更好地保留关键信息（原始请求、错误、待处理任务），适用于长会话。
* **减少智能体循环** — 向智能体提示词添加了反循环指令；降低了循环检测阈值，以便更早捕获重复的相同工具调用。
* **更快的请求启动** — LLM配置查询和域分类现在并发运行，将每个请求的开销减少400-1100ms。
* **更好的空工具处理** — 不返回输出的工具现在生成描述性消息，而不是空的"(no output)"，防止浪费性重试。
* **自动清理旧工具结果** — 早于最近6个结果的工具结果在上下文压缩前自动清除，保持对话精简。
* **工具结果聚合预算** — 总工具结果令牌限制为每个会话40K；当超出预算时，新结果被截断，防止来自大型API响应的上下文膨胀。
* **上下文溢出自动恢复** — 当LLM因上下文长度溢出拒绝请求时，智能体自动压缩到50%并重试，而不是导致整个对话崩溃。
* **基于关键词的工具选择** — 当查询明显按名称或描述关键词匹配特定工具时，智能体跳过基于LLM的工具选择调用，节省200-500ms。
* **LLM连接池** — 所有LLM API调用现在共享单个连接池，具有优化的keepalive设置，减少整个会话中的连接开销。
* **更智能的完成检查** — 对于长详细答案（>200令牌），跳过答案后验证步骤，消除不必要的LLM往返。
* **提供商中断时的模型回退** — 当主模型不可用（速率限制、过载或宕机）时，智能体自动使用快速模型重试，而不是失败。

### 已修复

* **智能体在不可读文件上的幻觉** — 当AI智能体无法读取文件（例如基于图像的PDF）时，它之前会读取其他无关文件并将其内容呈现为目标文件的内容。系统提示中的文件完整性护栏现在可以防止这种情况。
* **上传文件的文件ID注入** — 上传的文件现在在消息上下文中包含其UUID `file_id`，因此智能体可以直接通过 `read_uploaded_file` 访问它们，无需猜测。
* **从新模型结构读取视觉切换** — 模型配置上的 `supports_vision` 标志未从ModelGroup/ModelProviderModel ORM结构中正确读取。已修复。
* **改进了不可读文件的错误消息** — 当文件无法读取时，工具现在返回具体的指导信息（文件类型、视觉建议），而不是通用错误。

## \[v0.8.1] - 2026-03-29

### 新增

* **时区感知的管理员通知** — 管理员通知邮件现在以每个收件人配置的时区显示事件时间，而不是始终显示UTC。
* **渐进式数据库工具披露** — 单个`database`元工具，包含`list_tables`/`discover`/`query`子命令，替代单个表工具。通过`DATABASE_TOOL_MODE`环境变量配置（默认`progressive`，`legacy`回退）。
* **按需工具加载** — 当可用工具超过12个时，`request_tools`元工具让智能体在对话中动态加载额外工具，而不是被限制在初始选择。
* **渐进式MCP工具披露** — 单个`mcp`元工具，包含`discover`/`call`子命令，替代单个服务器工具。通过`MCP_TOOL_MODE`环境变量配置（默认`progressive`，`legacy`回退）。
* **单轮令牌预算断路器** — `REACT_MAX_TURN_TOKENS`环境变量为失控的智能体循环提供紧急停止。默认`0`（无限制）——改用按用户`token_quota`进行日常成本控制。
* **按模型原生函数调用切换** — `tool_choice_enabled`设置（环境变量+管理员按模型）让拒绝强制工具选择的模型跳过第1级，直接进入JSON模式。可在设置→模型→高级中配置。
* **DAG质量大修** — 五项改进：非快速步骤的默认模型升级为通用模型；规划中的技能自动发现；法律/医疗/金融领域的引用验证器；具有可配置截断倍数的结构化内容上下文保留；路由器中的领域分类与领域感知模型选择。
* **ReAct中的领域模型升级** — 专业领域（法律/医疗/金融）自动升级到推理模型，强制进行网络搜索和引用验证。
* **文件附件下载** — 聊天消息中的文件卡片现在可点击以下载原始文件。
* **管理员通知主开关** — 管理员邮件通知的全局开/关切换，带运行时SMTP检测。当SMTP未配置时显示警告横幅，并禁用所有通知控制。
* **SMTP Reply-To头** — 新的`SMTP_REPLY_TO`环境变量允许回复发送到与发件人不同的地址。
* **资源分叉第1阶段（MCP服务器+技能）** — `POST /api/mcp-servers/{id}/fork`和`POST /api/skills/{id}/fork`端点创建用户拥有的深层副本，`visibility=personal`和`forked_from`血统跟踪。MCP服务器分叉时跳过加密的环境变量/头；技能分叉时跳过发布状态。Alembic迁移为两个表添加`forked_from`列。41项测试。
* **工作流连接依赖自动订阅** — `DependencyAnalyzer._resolve_workflow`现在递归解析子工作流依赖，具有循环检测（已访问集）。智能体和子工作流节点正确添加为依赖清单中的内容依赖。缺失资源优雅处理（记录警告，无失败）。19项测试。
* **预构建解决方案模板（市场种子内容）** — 8个垂直解决方案模板在首次用户注册时幂等引导：财务审计、合同审查、数据报告、IT帮助台、人力资源入职、销售助手、内容编写、会议总结。每个捆绑一个智能体+技能，包含中文操作指南。发布到市场组织（`visibility=org`，`publish_status=approved`），立即在市场中可用。4项测试。
* **ReAct循环检测** — 重复相同工具调用的确定性检测。在3次连续调用相同参数后注入警告，防止智能体在失败工具上循环。通过`REACT_CYCLE_DETECTION_THRESHOLD`配置。
* **ReAct完成清单** — 在接受最终答案前的一次性验证提示（当使用了工具时），减少过早或不完整的响应。可按智能体实例切换。

### 变更

* **完成检查清单最小工具阈值** — 清单现在仅在智能体进行了3次或以上工具调用时触发（可通过`REACT_COMPLETION_CHECK_MIN_TOOLS`配置）。简单的1-2个工具任务会跳过验证，以避免不必要的延迟。
* **动态系统提示预算** — 从上下文预算计算中移除了固定的`SYSTEM_PROMPT_RESERVE`（4K令牌）。ContextGuard现在动态考虑系统提示，为每次迭代提供约4K更多可用上下文。
* **集中式工具截断** — 所有工具类型现在都委托截断到共享模块。默认值可通过`TOOL_OUTPUT_MAX_CHARS`、`TOOL_OUTPUT_MAX_ITEMS`、`TOOL_OUTPUT_MAX_BYTES`环境变量配置。
* **域名检测解耦** — 域名分类在每个端点中独立运行，不再与自动路由捆绑。域名SOP指令已软化为指导而非强制网络搜索。
* **`AUTO_ROUTING`环境变量已移除** — 自动端点始终对查询进行分类。

### 已修复

* **重复消息提交** — 聊天输入现在使用同步保护机制，防止在快速点击时提交相同消息多次。
* **结构化输出降级链** — 3级回退机制（原生FC → JSON模式 → 纯文本）现在能正确地遍历所有级别。
* **`json_mode_enabled` 数据库值被忽略** — 通过管理员配置的模型现在能正确使用其按模型设置，而不是总是回退到环境变量。
* **DAG规划失败消息** — 现在显示用户友好的双语消息，而不是原始管道错误。
* **MCP服务器所有者绕过allow\_fallback** — 服务器所有者不再被`allow_fallback=False`阻止。

## \[v0.8] - 2026-03-20

### 新增

* **市场重设计第一阶段——解决方案+组件** — 两层市场模型（解决方案：智能体/技能/工作流；组件：连接器/MCP服务器）配备范围选择器（全球市场/组织）。知识库从市场范围移除。统一订阅模型。
* **智能文件内容注入+`read_uploaded_file`工具** — 小文件（32K字符以下）自动内联到LLM上下文；大文件获取元数据+工具提示。双模式读取工具支持分页和正则搜索。`GET /api/files/{file_id}/content`端点。
* **工作流蓝图系统** — 多步骤自动化的可视化工作流编辑器：25种节点类型（开始、结束、LLM、条件分支、问题分类器、智能体、知识检索、连接器、HTTP请求、变量赋值、模板转换、代码执行、迭代器、循环、变量聚合器、参数提取器、列表操作、转换、文档提取器、问题理解、人工干预、子工作流、环境变量等），React Flow v12编辑器支持拖放调板、自动布局、SSE实时执行、变量插值、条件/分类器分支、每个节点的错误策略、每个节点的超时设置、导入/导出/复制、版本历史与差异查看器、14个内置模板、306项测试。
* **工作流触发器** — 支持时区的Cron调度；公开API密钥（`wf_`前缀）用于外部执行无需用户认证；批量执行（最多100个输入集，可配置并行度）。
* **工作流操作** — 实时执行日志查看器、包含变量快照的追踪查看器、画布上的运行重放叠加层、运行历史导出、包含每日趋势和百分位数的分析仪表板、每个节点的统计面板、收藏/固定、内联验证徽章、画布节点搜索（`Cmd+F`）、键盘快捷键、吸附网格。
* **工作流管理+模板** — 所有工作流的管理选项卡、带有管理员CRUD和5个种子模板的`WorkflowTemplate`模型、发布流程配备组织级审查门控、外部引用的导入冲突解决器。
* **智能体技能系统** — 按需技能加载：`Skill`模型支持CRUD/发布/审查、`read_skill(name)`工具用于渐进式披露（约80%令牌减少）、每个智能体的`compact_instructions`用于自定义ContextGuard压缩。完整的技能UI包括列表页面、编辑器和智能体技能选择器。
* **ConnectorMetaTool（渐进式披露第1-2阶段）** — 单个元工具替代每个操作工具。系统提示接收轻量级存根（约30令牌/连接器）；智能体按需调用`discover`/`execute`。功能标志`CONNECTOR_TOOL_MODE`用于向后兼容。
* **连接器导入/导出/分叉** — 通过JSON导出共享连接器模板，通过分叉克隆和自定义。后端在导出时清理凭证。
* **连接器凭证加密+每用户覆盖** — `connector_credentials`表配备Fernet加密、`allow_fallback`标志、`GET/PUT/DELETE /my-credentials`端点。
* **发布审查UI** — 组织级审查系统支持批准/拒绝工作流、资源卡上的状态徽章、发布对话框中的审查通知、被拒绝资源的重新提交。
* **语义模式注解** — 16个预定义的连接器字段语义标签配备`description`和`pii`标志，在LLM工具描述中呈现。
* **智能体中循环自反思** — 目标检查提示每6次迭代注入ReAct中，防止长链中的偏离。
* **影子市场组织+资源订阅** — 基于拉取的资源共享：通过市场发现资源并显式订阅。市场API用于浏览/订阅/取消订阅。
* **智能体自动发现+子智能体绑定** — `discoverable`标志+`sub_agent_ids`白名单+`CallAgentTool`用于一级委托。
* **MCP服务器凭证+每用户覆盖** — `mcp_server_credentials`表配备`allow_fallback`标志用于凭证回退行为。
* **连接器/知识库切换** — 两种资源类型的暂停/恢复端点。
* **独立知识库对话** — 对话上的`kb_ids`字段用于直接知识库聊天无需智能体绑定。
* **审查日志审计选项卡** — 管理员审计页面配备系统日志/审查日志切换和可过滤的每个组织/资源的审查追踪。
* **综合中的智能体指令** — `agent_directive`参数确保最终答案遵守智能体的核心目的。

### Changed

* **基于订阅的可见性模型** — 从3层简化为2层（own → subscribed）。自动迁移保留现有访问权限。
* **工具缓存白名单** — 将黑名单替换为工具上的显式 `cacheable` 属性。11个只读工具标记为可缓存。
* **DAG执行器级联失败** — 失败的步骤现在级联阻止依赖项，具有传递传播。
* **DAG规划器改进** — 规划器中的工具描述、所有轮次的完整重新规划历史、14个引擎常数参数化为环境变量。
* **stream\_answer观察截断** — 从2000增加到8000字符（可通过 `REACT_TOOL_OBS_TRUNCATION` 配置）。
* **证据置信度UI** — 琥珀色警告卡片、带悬停弹出框的 `[N]` 引用徽章、带并排比较的冲突警告横幅。
* **工作流版本变更摘要** — 从蓝图差异自动生成人类可读的摘要，在版本保存时生成。
* **工作流运行保留清理** — 后台清理任务，具有可配置的年龄/计数限制。环境变量：`WORKFLOW_RUN_MAX_AGE_DAYS`、`WORKFLOW_RUN_MAX_PER_WORKFLOW`。
* **连接器断路器** — 三态机（closed/open/half-open），具有按连接器故障跟踪和监控端点。
* **用轻量级BFS自动布局替换elkjs** — `/workflows/[id]` 包从473 kB减少到43 kB。

### 已修复

* **工作流eval命名空间扁平化** — 修复了ConditionBranch和VariableAssign中的短变量名解析。
* **切换`is_active`时无需重新审查** — 切换`is_active`不再将`publish_status`从`approved`恢复为`pending_review`。
* **条件分支的级联跳过** — 跳过的节点正确地停用传出边。
* **依赖分析器** — 修复了`skill_ids`解析、不区分大小写的节点类型匹配。

### 已移除

* 移除了 `is_global` 字段和所有全局可见性概念——已由 Market 组织 + 订阅替代。
* 移除了全局智能体/MCP 服务器管理员端点。

## \[v0.7.5] - 2026-03-12

### 新增

* **免费模式切换** — 在对话中切换Auto/React/DAG模式。通过`metadata.mode`进行逐轮模式跟踪。
* **三种模型角色** — General、Fast和Reasoning层级的独立环境配置。Fast模型不再继承主模型设置。
* **DAG引擎改进** — `StepOutput`结构化数据、带异步锁防雷鸣羊群效应的工具缓存、带重试的逐步LLM验证（`DAG_STEP_VERIFICATION`）、通过快速LLM分类的自动路由（`AUTO_ROUTING`）。
* **连接器凭证加密** — 认证令牌提取到`connector_credentials`表，通过`CREDENTIAL_ENCRYPTION_KEY`使用Fernet加密。按用户凭证覆盖端点。`allow_fallback`标志。
* **ModelConfig API密钥静态加密** — 透明的写入时加密/读取时解密，带向后兼容的明文检测。

### 已更改

* **骨架屏** — 所有列表/网格页面在加载时显示布局感知的骨架屏，而不是加载旋转器。

### 已修复

* 快速模型不再继承主模型的设置。
* SSE 路由事件字段名称与后端对齐。

## \[v0.7.4] - 2026-03-12

### Added

* **Evaluation Center** — 测试数据集管理、并行评估运行（支持LLM评分）、按案例查看通过/失败/延迟/令牌结果的查看器（支持自动轮询）。
* **Admin: `json_mode_enabled` 按模型标志** — 显式切换，防止AWS Bedrock预填充问题。ENV模型由`LLM_JSON_MODE_ENABLED`控制。
* **SSE Protocol v2** — 实时流式传输，支持`delta_reasoning`、`usage`字段，分离`done`/`suggestions`/`title`/`end`事件。
* **AI Builder扩展** — 7个新的构建器工具、`is_builder`标志、构建器提示自动刷新、SSRF防护。完整的ReAct智能体对话用于连接器管理。
* **双数据库支持** — SQLite（零配置）+ PostgreSQL（生产环境）。Docker Compose自动配置PG并进行健康检查。
* **扩展思考/推理** — `LLM_REASONING_EFFORT`和`LLM_REASONING_BUDGET_TOKENS`用于OpenAI o系列、Gemini 2.5+、Claude。
* **Admin: 工具禁用** — 按工具启用/禁用切换；禁用的工具在运行时从聊天中过滤。
* **Settings: Organizations标签页** — 直接从Settings创建、加入、管理组织并设置成员角色。
* **Docker Compose部署** — 单一镜像、命名卷、独立Next.js输出。
* **Export: PDF格式** — 对话可导出为PDF文档。
* **多工作进程支持** — `WORKERS=N`环境变量；Redis中断代理用于跨工作进程中继。

### 已更改

* **LLM 层：LiteLLM** — 用通用提供商支持替换了直接的 `AsyncOpenAI` 客户端。
* **结构化输出降级** — 统一了 `structured_llm_call()`，包含 3 级提取（Native FC → JSON Mode → 纯文本 + 正则表达式）。
* **智能中继路由** — 从 URL 路径模式自动检测第三方中继平台的 API 协议。

### 已修复

* Docker 沙箱（DooD）卷挂载路径转换。
* 安全性：沙箱 AST dunder 验证、MCP stdio 默认值、SSRF DNS 重绑定、shell 元字符规避、连接器模板注入。
* 管理员仪表板统计在 PostgreSQL 上崩溃。
* Docker：i18n 文件发现、启动竞态条件、自定义端口的 OAuth 自动检测。
* 导出：CJK 的 RFC 5987 文件名。

## \[v0.7.3] - 2026-03-06

### 已添加

* **全局MCP服务器** — 由管理员配置，在所有聊天会话中加载。
* **结构化审计日志** — `write_audit()` 辅助函数，具有结构化列。

### 已修复

* 邀请码向后兼容旧版 `registration_enabled` 字段。

## \[v0.7.2] - 2026-03-06

### 新增

* **邀请制注册** — 三种模式（开放/邀请/禁用），支持邀请码CRUD。
* **存储管理** — 按用户磁盘使用量、清空、孤立文件清理。
* **按用户强制登出** — 管理员令牌撤销。
* **对话审核** — 管理员列表/删除所有对话。

## \[v0.7.1] - 2026-03-06

### 新增

* **API 健康仪表板** — 系统统计、连接器指标、令牌使用图表。
* **JWT 认证** — 基于令牌的 SSE 认证、对话所有权。
* **管理员 API** — 智能体管理、按用户令牌配额（429 强制执行）。

## \[v0.7] - 2026-03-06

### 新增

* **管理平台** — 用户管理、角色切换、密码重置、账户启用/禁用。
* **首次运行设置向导** — 引导式管理员账户创建。
* **个人中心** — 按用户全局指令、语言偏好设置。

## \[v0.6.5] - 2026-03-05

### 新增

* **实用工具** — `email_send`、`json_transform`、`template_render`、`text_utils`。
* **连接器响应过滤** — `CONNECTOR_RESPONSE_MAX_CHARS` 和 `CONNECTOR_RESPONSE_MAX_ITEMS`。
* **嵌入模型选项** — Jina、OpenAI 和自定义提供商。

## \[v0.6] - 2026-03-01

### 已添加

* **连接器平台** — 完整的 CRUD、ConnectorToolAdapter、按用户凭证加密、确认闸门、断路器、审计日志。
* **MCP 集成** — 通过协议的工具自动发现、进程隔离。

## \[v0.5] - 2026-02-28

### 已添加

* **完整RAG管道** — Jina嵌入 + LanceDB + FTS + RRF + 重排器。
* **有根据的生成** — 证据锚定引用、冲突检测、置信度分数。
* **知识库文档管理** — 分块级CRUD、搜索、重试、模式迁移。
* **ContextGuard + 固定消息** — Token预算管理器。
* **DAG重新规划** — 最多3轮；LLM Compact用于内存。

## \[v0.4] - 2026-02-25

### 新增

* **多轮对话** — DbMemory 持久化、智能截断。
* **工具步骤折叠 UI** — 折叠/展开工具调用。
* **HTTP 请求 + shell 执行工具**。
* **智能体管理** — 创建、配置、发布绑定模型/工具。
* **JWT 身份验证**。

## \[v0.3] - 2026-02-25

### 新增

* **网络工具** — `web_search`（Jina/Tavily/Brave）、`web_fetch`。
* **文件操作 + MCP 客户端**。
* **DAG 可视化** — 交互式流程图，实时状态显示。
* **Docker 中的代码执行** — `--network=none`、内存限制、超时控制。

## \[v0.2] - 2026-02-24

### 新增功能

* **重试与速率限制** — 指数退避。
* **使用情况追踪** — 按请求的令牌/成本统计。
* **原生函数调用** — 直接模型工具选择。
* **多模型支持** — `FAST_LLM_MODEL` 用于 DAG 步骤。
* **内存系统** — 窗口、摘要、数据库内存。
* **FastAPI 后端** — `/api/execute`、`/api/stream`（SSE）。

## \[v0.1] - 2026-02-22

### 新增

* **ReActAgent** — 推理 → 行动 → 观察循环。
* **DAGPlanner** — LLM生成的依赖图、并发执行、结果验证。
* **Tools** — 计算器、Python执行。
* **Portal UI** — Next.js流式传输、深色/浅色主题、KaTeX。
