chatgpt openapi 的限制
现在有一个坏消息,一个好消息。
好消息是,chatgpt 已经开放了 openapi。
坏消息是,openapi 是收费的,而且并不像你想的那么便宜。
目前官网的标价是:每1,000 token 收费0.002 美元,约为 750 个单字。但是目前 API 不会记得你的 conversation 内容,也就是说,openapi 是没有 context 信息的。如果你希望 chatgpt 足够智能,能够像网页版本一样跟你产生真正有上下文的对话,那么你每次调用API 时,都必须叠加上之前的对话内容,而文字越多,花费的token 就越多。所以token 的花费会是指数型增加。
这样看的话,一个对话,有可能很容易就能消费掉 1w 个token,甚至更高。
模拟网页端身份进行对话
那么是否可以模拟网页端的身份来和 chatgpt 对话,并基于此做一个服务呢,这样不就可以免费使用了吗,而且网页端的功能有可能比 openapi 功能更新更及时。
答案是可以的。一个比较知名的项目是 acheong08/ChatGPT,这是一个 python 的项目,短短几个月时间,已经获得了接近 2w 个 star。这个项目目前提供模拟网页登录的 python 库,也提供了 openapi 的版本(openapi 的版本是最近更新的,2w 个star 并不是因为这部分能力)。但是这个服务并没有提供现成可用的 api 版本,使你在非 python 的项目中使用这个项目可能会有一点困难。而 u2takey/chatgpt-go 这个 go 的项目,不仅仅提供了 go 语言版本的 sdk,而且提供了一个 开箱即用的 api 服务,以及 dockerfile,相对而言就方便多了。
如何使用
这个项目我们从使用 u2takey/chatgpt-go docker service 版本的角度看看怎么使用。目前项目已经提供了一个开箱即用了 docker 镜像: ccr.ccs.tencentyun.com/leiwang/chat-service:v0
,在你的主机上 pull 这个镜像,并且运行起来即可。
# 启动运行
root@VM-0-8-ubuntu:/home/ubuntu# docker run -d -p 8088:8088 ccr.ccs.tencentyun.com/leiwang/chat-service:v0
c2f95863b5c476fe722f2fc48d95f082739e844c9aa499fee0d97cd0cc6bd1c1
# 检查运行状态
root@VM-0-8-ubuntu:/home/ubuntu# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c2f95863b5c4 ccr.ccs.tencentyun.com/leiwang/chat-service:v0 "/usr/local/bin/chat…" 5 seconds ago Up 2 seconds 0.0.0.0:8088->8088/tcp unruffled_bohr
这个服务非常简单,主要只有两个 api:
bind
: 意思是将你的 chatgpt 网页账号记录到服务中,这样服务就有了你的身份,模拟你的身份登录进行 chatgpt 的 api 访问。bind 支持多种登录方式,如:
#Email/Password 不支持 Google/Microsoft 帐户
{
"email": "email",
"password": "your password"
}
# Session token 来自 cookies on chat.openai.com as "__Secure-next-auth.session-token"
{
"session_token": "..."
}
# 3. Access token 访问 https://chat.openai.com/api/auth/session 就可以获取
{
"access_token": "<access_token>"
}
同时 bind 的时候,你需要带一个 user_id 参数,标识你的身份,后面访问 其他接口,带上 user_id 即可。下面是一个 使用 Access token 绑定身份的例子,首先访问 https://chat.openai.com/api/auth/session, 把 token copy 出来,然后 bind。
代码语言:txt复制# 使用 Access token 绑定身份的例子
root@VM-0-8-ubuntu:/home/ubuntu# curl localhost:8088/bind -d '{"user_id": "test", "access_token": "your token"}'
{"code":200,"message":""}
ask
:ask 就是真正的提问环节了,参数也非常简单,最主要的参数是prompt
, 标识你提问的问题,如果你要继续一个对话,将上次返回的conversation_id
作为参数传入即可。
root@VM-curl localhost:8088/ask -d '{"user_id": "test", "prompt": "什么是快乐星球"}' | jq
{
"code": 0,
"message": "",
"data": {
"message": "抱歉,我不知道“快乐星球”是指哪个具体的概念或事物。可以提供更多的背景信息或上下文吗?这样我才能更好地回答你的问题。",
"conversation_id": "d0b3a4f8-b889-46f1-b113-2d0fed3d6a56",
"parent_id": "caf08b56-6f4d-4aa2-9a67-c3fbe04125d7",
"model": ""
}
}
curl localhost:8088/ask -d '{"user_id": "test", "prompt": "出现在中国的一个电视剧里面", "conversation_id": "d0b3a4f8-b889-46f1-b113-2d0fed3d6a56"}' | jq
{
"code": 0,
"message": "",
"data": {
"message": "如果“快乐星球”是出现在中国的一部电视剧里面,那么可能是该电视剧中的一个虚构的地方或组织。很抱歉,由于我不知道具体是哪一部电视剧,也不清楚“快乐星球”在该剧中的角色和背景,无法提供更详细的回答。",
"conversation_id": "d0b3a4f8-b889-46f1-b113-2d0fed3d6a56",
"parent_id": "d7ec14ea-56fa-4dd2-a1db-99548911d8b4",
"model": ""
}
}
结语
模拟用户登录的 u2takey/chatgpt-go 项目使用起来非常简单,而且免费,但是也有缺点,即如果 openapi 官方改变了网页端的登录鉴权方式,项目也有对应的进行更新才能继续使用。
使用 u2takey/chatgpt-go 搭建属于自己的 chatgpt api 服务之后,你就可以发挥想象力了,你可以基于此做一个微信聊天机器人,或者一个 alfred 插件,或是一个命令行工具,也可以小范围免费分享你 api,作为团队的共享工具。