loca1h0st's Blog
loca1h0st's Blog

一个OpenAI格式转Claude的返回包转换器(流输出)

一个OpenAI格式转Claude的返回包转换器(流输出)

背景

现在的大模型领域各种模型层出不穷,有OpenAI的GPT系列,有阿里的通义,也有Anthropic的Claude系列。从我个人的需求而言,在通用和语言领域我已经有了官方的OpenAI的API,但是在代码编写领域,尽管OpenAI的GPT-4o堪堪能用,但是还是急缺一个Claude-sonnet系列模型,这点也可以从AI模型的评分中可以看到:

https://blog.mrtblogs.net/wp-content/uploads/2024/12/image-17-1024x545.png

而对于Claude官方,由于我人身处国内,那Web账号的封号,信用卡支付的不方便等多种原因都阻碍我去直接使用相关的功能,寻找一个中转站便是一个不错的选择。

中转站介绍

通过网上搜索,发现了梦境API(https://oneapi.paintbot.top/)这个中转站点,优势主要有以下两点:

  • 模型齐全,包含OpenAI/Gemini/Claude
  • 便宜,官方宣传:目前价格为1¥兑换1$,全部模型目前都是官方倍率,相当于比官方价格便宜7倍多。

支持的模型列表截图:

https://blog.mrtblogs.net/wp-content/uploads/2024/12/image-18-1024x165.png

中转站痛点

找中转站不难,但痛点在于,大部分的中转站基本都基于New-API这个开源程序,导致所有的渠道(OpenAI/Claude/Gemini)的返回格式都会变成OpenAI的兼容格式,这点也可以在原程序中的介绍和issue中找到相关讨论痕迹。issue地址:https://github.com/Calcium-Ion/new-api/issues/578

这样的格式转换尽管部分时候是好用的,但是仍然会带来一个问题,那就是对于我客户端而言,我无法拆开我的OpenAI和Claude两个渠道,只能作为同一个渠道进行使用。例如,在中转站中的lobechat客户端使用Claude模型将会变成这样:

https://blog.mrtblogs.net/wp-content/uploads/2024/12/image-19-1024x527.png

这对于我而言是不可接受的,在背景中我有提到我有OpenAI的渠道,我仅仅只是想使用中转站的Claude模型而已。

解决方案

方案一(不成功):

在issue中,官方的答案是建议使用new-api-horizon这个免费使用但闭源的软件:

我尝试使用了这个方案,但这个系统应该是针对我渠道本来就是Claude模式设计的,当遇到OpenAI的兼容模式内容时,尽快能正常输出,但是每句的回复开始2-3个字符会被吞掉,无法正常使用。一个可能的案例如下:

https://blog.mrtblogs.net/wp-content/uploads/2024/12/image-20-1024x313.png

方案二:

使用一些软件,能够配置OpenAI和OpenAI Compatible两个渠道,此时就可以比较好的满足我的需求,例如使用OpenCat软件即可符合我的需求:

https://blog.mrtblogs.net/wp-content/uploads/2024/12/image-21-1024x610.png

方案三:

其实方案二已经基本满足了我的需求,但是仍然还有一下几个痛点无法解决:

  • OpenCat是MacOS/iOS的独占软件,在Windows上没办法使用
  • 无法分享给第三方使用(尽管可能性很小)
  • 我的常用软件是LobeChat,OpenCat已经很少使用了
  • 完美主义犯病…

在搜索了互联网后,发现对于AI的格式转换上,由于OpenAI的爆火和市占率,大家都写了非常多的格式转换器,但基本上都是xxx to OpenAI格式,对于我的需求,OpenAI to Claude一个都没有…迫于无奈计划开始自己写一个转换器:

首先参考Claude AI的API文档,查看当流输出时的格式:https://docs.anthropic.com/en/api/messages-streaming

一个Basic的示例,将会以message_start的event开始,接着会发出content_block_start和ping的event,接着就是正常的流式输出content_block_delta,停止时发送一个空的message_stop

https://blog.mrtblogs.net/wp-content/uploads/2024/12/image-22-1024x952.png

然后查看New-API软件(中转站使用)的源码,了解中转站是如何将Claude的响应转成OpenAI兼容模式的:

https://blog.mrtblogs.net/wp-content/uploads/2024/12/image-23-1024x717.png

接下来对照格式和中转站的转换逻辑将代码逆向写一遍即可完成,基本逻辑是当收到中转站的第一个响应时,往客户端发出message_start/content_block_start/ping三个event,然后将获取的内容按顺序返回给前端,最终输出message_stop即可:

https://blog.mrtblogs.net/wp-content/uploads/2024/12/image-24-1024x896.png

完整的源代码可以见我的github:

结尾

最终得到如下的效果:

https://blog.mrtblogs.net/wp-content/uploads/2024/12/image-25-1024x641.png

推广

如果你对这个中转站有兴趣,可以使用我的推广码注册:https://oneapi.paintbot.top/register?aff=J57n

说明:毕竟不是官方的API,群主说即使跑路了也会退款,大家自行判断

# # # #
首页      Docker      一个OpenAI格式转Claude的返回包转换器(流输出)

发表回复

textsms
account_circle
email

loca1h0st's Blog

一个OpenAI格式转Claude的返回包转换器(流输出)
背景 现在的大模型领域各种模型层出不穷,有OpenAI的GPT系列,有阿里的通义,也有Anthropic的Claude系列。从我个人的需求而言,在通用和语言领域我已经有了官方的OpenAI的API,但是在…
扫描二维码继续阅读
2024-12-15