[PR #226] [MERGED] refactor(orchids): 重构 Orchids API 事件处理逻辑,添加原生工具调用支持 #307

Closed
opened 2026-02-27 07:18:54 +03:00 by kerem · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/justlovemaki/AIClient-2-API/pull/226
Author: @leonaii
Created: 1/13/2026
Status: Merged
Merged: 1/13/2026
Merged by: @justlovemaki

Base: mainHead: main


📝 Commits (1)

  • e2b7ae1 refactor(orchids): 重构 Orchids API 事件处理逻辑,添加工具适配

📊 Changes

1 file changed (+631 additions, -55 deletions)

View changed files

📝 src/providers/claude/claude-orchids.js (+631 -55)

📄 Description

概述

重构 claude-orchids.js 的事件处理逻辑,基于 Orchids 官方 API 事件流格式,实现原生工具调用支持。

主要变更

1. 新增 fs_operation_response 响应机制

  • 解决 Orchids API 等待 fs_operation_response 的问题
  • 在收到 model.tool-callcoding_agent.Edit.edit.completed 事件后自动发送响应

2. 重构 _convertToAnthropicSSE 方法

  • 完全重写事件处理流程
  • 支持 Orchids 官方 API 的所有事件类型

3. 新增 model 事件处理

  • model.reasoning-start/delta/end - 推理事件
  • model.tool-input-start/delta/end - 工具输入事件
  • model.tool-call - 工具调用完成事件
  • model.text-start/delta/end - 文本事件
  • model.finish - 完成事件

4. 新增 coding_agent 工具调用事件支持

  • coding_agent.Edit.edit.* - 编辑操作事件
  • coding_agent.todo_write.* - TODO 写入事件

5. 修复叠字问题

  • 忽略重复的 coding_agent.reasoning.* 事件
  • 忽略重复的 coding_agent.response.chunk 事件
  • 忽略重复的 output_text_delta 事件

6. 扩展状态跟踪

  • 新增工具调用状态管理字段
  • 新增编辑操作状态管理字段

7. 优化 response_done 处理

  • 支持原生 function_call 输出解析
  • 正确转换为 Claude API 的工具调用格式

技术细节

Orchids API 事件流格式

Orchids API 使用 WebSocket 事件流,包含两类事件:

  1. model. 事件*(低级别,用于处理)

    • reasoning-start/delta/end - 推理内容
    • text-start/delta/end - 文本内容
    • tool-input-start/delta/end - 工具输入
    • tool-call - 工具调用完成
    • finish - 流结束
  2. coding_agent. 事件*(高级别,大部分忽略以避免重复)

    • Edit.edit.* - 编辑操作(需要处理)
    • todo_write.* - TODO 写入(需要处理)
    • reasoning.* - 推理(忽略,与 model.reasoning 重复)
    • response.chunk - 响应块(忽略,与 model.text 重复)

事件转换映射

Orchids 事件 Claude SSE 事件
model.reasoning-start content_block_start (type: thinking)
model.reasoning-delta content_block_delta (type: thinking_delta)
model.reasoning-end content_block_stop
model.text-start content_block_start (type: text)
model.text-delta content_block_delta (type: text_delta)
model.text-end content_block_stop
model.tool-input-start content_block_start (type: tool_use)
model.tool-input-delta content_block_delta (type: input_json_delta)
model.tool-call content_block_stop
model.finish message_delta + message_stop

测试

  • 语法检查通过 (node --check)
  • 推理事件正确转换
  • 文本事件正确转换
  • 工具调用事件正确转换
  • 无叠字问题

相关 Issue

解决 Orchids 服务无法正确处理工具调用的问题。

变更文件

  • src/providers/claude/claude-orchids.js (+631, -55)

🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/justlovemaki/AIClient-2-API/pull/226 **Author:** [@leonaii](https://github.com/leonaii) **Created:** 1/13/2026 **Status:** ✅ Merged **Merged:** 1/13/2026 **Merged by:** [@justlovemaki](https://github.com/justlovemaki) **Base:** `main` ← **Head:** `main` --- ### 📝 Commits (1) - [`e2b7ae1`](https://github.com/justlovemaki/AIClient-2-API/commit/e2b7ae1392a8b6ad44cdac0a31e53326d0aa7e02) refactor(orchids): 重构 Orchids API 事件处理逻辑,添加工具适配 ### 📊 Changes **1 file changed** (+631 additions, -55 deletions) <details> <summary>View changed files</summary> 📝 `src/providers/claude/claude-orchids.js` (+631 -55) </details> ### 📄 Description ## 概述 重构 `claude-orchids.js` 的事件处理逻辑,基于 Orchids 官方 API 事件流格式,实现原生工具调用支持。 ## 主要变更 ### 1. 新增 fs_operation_response 响应机制 - 解决 Orchids API 等待 `fs_operation_response` 的问题 - 在收到 `model.tool-call` 或 `coding_agent.Edit.edit.completed` 事件后自动发送响应 ### 2. 重构 _convertToAnthropicSSE 方法 - 完全重写事件处理流程 - 支持 Orchids 官方 API 的所有事件类型 ### 3. 新增 model 事件处理 - `model.reasoning-start/delta/end` - 推理事件 - `model.tool-input-start/delta/end` - 工具输入事件 - `model.tool-call` - 工具调用完成事件 - `model.text-start/delta/end` - 文本事件 - `model.finish` - 完成事件 ### 4. 新增 coding_agent 工具调用事件支持 - `coding_agent.Edit.edit.*` - 编辑操作事件 - `coding_agent.todo_write.*` - TODO 写入事件 ### 5. 修复叠字问题 - 忽略重复的 `coding_agent.reasoning.*` 事件 - 忽略重复的 `coding_agent.response.chunk` 事件 - 忽略重复的 `output_text_delta` 事件 ### 6. 扩展状态跟踪 - 新增工具调用状态管理字段 - 新增编辑操作状态管理字段 ### 7. 优化 response_done 处理 - 支持原生 `function_call` 输出解析 - 正确转换为 Claude API 的工具调用格式 ## 技术细节 ### Orchids API 事件流格式 Orchids API 使用 WebSocket 事件流,包含两类事件: 1. **model.* 事件**(低级别,用于处理) - `reasoning-start/delta/end` - 推理内容 - `text-start/delta/end` - 文本内容 - `tool-input-start/delta/end` - 工具输入 - `tool-call` - 工具调用完成 - `finish` - 流结束 2. **coding_agent.* 事件**(高级别,大部分忽略以避免重复) - `Edit.edit.*` - 编辑操作(需要处理) - `todo_write.*` - TODO 写入(需要处理) - `reasoning.*` - 推理(忽略,与 model.reasoning 重复) - `response.chunk` - 响应块(忽略,与 model.text 重复) ### 事件转换映射 | Orchids 事件 | Claude SSE 事件 | |-------------|----------------| | `model.reasoning-start` | `content_block_start` (type: thinking) | | `model.reasoning-delta` | `content_block_delta` (type: thinking_delta) | | `model.reasoning-end` | `content_block_stop` | | `model.text-start` | `content_block_start` (type: text) | | `model.text-delta` | `content_block_delta` (type: text_delta) | | `model.text-end` | `content_block_stop` | | `model.tool-input-start` | `content_block_start` (type: tool_use) | | `model.tool-input-delta` | `content_block_delta` (type: input_json_delta) | | `model.tool-call` | `content_block_stop` | | `model.finish` | `message_delta` + `message_stop` | ## 测试 - [x] 语法检查通过 (`node --check`) - [x] 推理事件正确转换 - [x] 文本事件正确转换 - [x] 工具调用事件正确转换 - [x] 无叠字问题 ## 相关 Issue 解决 Orchids 服务无法正确处理工具调用的问题。 ## 变更文件 - `src/providers/claude/claude-orchids.js` (+631, -55) --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
kerem 2026-02-27 07:18:54 +03:00
Sign in to join this conversation.
No labels
pull-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/AIClient-2-API-justlovemaki#307
No description provided.