Bộ chuyển đổi OpenAI ⇄ Anthropic
Chuyển đổi mảng messages giữa OpenAI Chat Completions và Anthropic Messages API. Xử lý system messages, tool calls, khối hình ảnh, multi-turn. Trong trình duyệt, không cần API key.
Cái này để làm gì?
API Chat Completions của OpenAI và Messages API của Anthropic đều cho phép bạn gửi hội thoại multi-turn, nhưng định hình JSON đủ khác để prompt và trace tool-call không trôi sạch khi bạn đổi nhà cung cấp. Khác biệt nhỏ (vị trí system message, tool-call vs tool-use, hình dạng khối hình, role: 'tool' vs tool_result trong content) nhưng mỗi cái là một hố thỏ 10 phút khi bạn đang trong deadline. Bộ chuyển đổi này xử lý dịch thuật: dán hội thoại OpenAI, nhận lại phiên bản Anthropic (hoặc ngược lại).
Cái gì được dịch
- System messages. OpenAI: tin nhắn thông thường với
role: "system". Anthropic: fieldsystemtop-level trên request. Chúng tôi di chuyển và ghép nối nếu có nhiều. - Tool-call (phía assistant). OpenAI:
tool_calls: [{id, type:'function', function:{name, arguments:'JSON-string'}}]. Anthropic: khốitool_usebên trongcontentvới{id, name, input}(object đã parse, không phải string). Chúng tôi parse arguments đã escape của OpenAI thànhinputcó cấu trúc Anthropic mong đợi; chiều ngược lại re-stringify. - Tool results. OpenAI: tin nhắn riêng với
role: "tool",tool_call_id,content. Anthropic: khốitool_resultbên trong content của tin nhắn user tiếp theo vớitool_use_id. Tin nhắntoolliên tiếp của OpenAI được gộp thành một user Anthropic với nhiềutool_result. - Hình ảnh. OpenAI:
{type:'image_url', image_url:{url}}. Anthropic:{type:'image', source:{type:'base64',media_type,data}}hoặc URL-source. Chúng tôi phát hiện URLdata:và chuyển đổi; URL trần qua như URL-source. - Văn bản thuần. OpenAI dùng string; Anthropic chấp nhận string hoặc mảng một phần tử
[{type:'text', text}]. Chúng tôi dùng cái đơn giản hơn.
Cái gì không được dịch
- Sự kiện streaming. Chúng tôi xử lý JSON request/response, không phải stream SSE. Nếu có dump stream, tái tạo tin nhắn cuối trước.
- Field riêng của nhà cung cấp.
logprobscủa OpenAI,stop_sequencescủa Anthropic, tham số sampling — sống ở top-level của request, không trong messages. - Hint cache-control.
cache_control: {type:'ephemeral'}của Anthropic không có tương đương OpenAI. Sống sót qua OpenAI → Anthropic (không có nguồn), nhưng bị bỏ trong Anthropic → OpenAI. - Định nghĩa tool. Schema của tool (field
toolstrên request) sống ngoài mảng messages. Định dạng khác giữa các nhà cung cấp — chuyển đổi riêng.
Bẫy thường gặp
- Escaping arguments OpenAI.
argumentscủa OpenAI là string JSON-encoded, không phải object đã parse. Nếu hỏng (hiếm, xảy ra với model nhỏ), chúng tôi đặt vào_rawtronginputAnthropic thay vì ném lỗi. - System top-level Anthropic. Trong OpenAI → Anthropic kết quả là
{system, messages}. Nếu chỉ muốn mảng, dùng.messages— nhưng nhớ đính kèmsystemvào request API riêng. - Luân phiên nghiêm ngặt. Anthropic yêu cầu user/assistant luân phiên nghiêm ngặt (sau system tùy chọn). Bộ chuyển đổi nói chung giữ; nếu nguồn OpenAI có hai user liên tiếp, output Anthropic cũng có — và API sẽ từ chối. Merge trước.
- Multi-modal trong OpenAI. Tin nhắn user OpenAI với hình ảnh dùng content array thay vì string. Chúng tôi xử lý; chỉ cần đảm bảo input của bạn parse được như JSON.
- Quyền riêng tư. Không gì rời khỏi trang. Chuyển đổi JS thuần; không API key, không gọi network.