添加了对官方 ChatGPT 模型的支持!您现在可以使用ChatGPTClient
将gpt-3.5-turbo
模型与官方 OpenAI API 结合使用。这与 ChatGPT 使用的模型相同,并且是目前最强大的模型。该模型的使用不是免费的,但它比text-davinci-003
便宜 10 倍(每 1k 代币售价 0.002 美元)。
有关更多信息,请参阅 OpenAI 的文章 ChatGPT 和 Whisper API 简介。
要使用它,请将 modelOptions.model
设置为gpt-3.5-turbo
, ChatGPTClient
将处理其余部分。ChatGPTClient
中使用的默认模型现在是gpt-3.5-turbo
。您仍然可以照常设置userLabel
、 chatGptLabel
和promptPrefix
(系统指令)。
如果您继续自动化 chat.openai.com,您的帐户被禁止的可能性可能会更高。继续这样做需要您自担风险。
我添加了一个实验性的ChatGPTBrowserClient
,它依赖于利用 Cloudflare 旁路的反向代理服务器,允许您与 ChatGPT (chat.openai.com) 对话,而无需浏览器自动化。您所需要的只是来自 https://chat.openai.com/api/auth/session 的访问令牌。
与往常一样,请注意,如果您选择采用此路线,则会将您的访问令牌暴露给闭源第三方服务器。如果您担心这一点,您可以选择使用免费的 ChatGPT 帐户来最大程度地降低风险,或者继续使用ChatGPTClient
代替text-davinci-003
模型。
不幸的是,我们用来访问 ChatGPT 底层模型的方法已被修补。您现在的选择是使用带有text-davinci-003
模型的官方 OpenAI API(需要花钱),或者使用基于浏览器的解决方案与 ChatGPT 的后端交互(功能较弱,速率受限,并且目前该库不支持)。
在 @PawanOsman 的帮助下,我们找到了继续使用 ChatGPT 底层模型的方法。为了避免再次失去访问权限,我们决定提供与 OpenAI API 兼容的反向代理服务器。我已更新ChatGPTClient
以支持使用反向代理服务器而不是 OpenAI API 服务器。有关可用代理服务器及其工作原理的更多信息,请参阅使用反向代理。
请注意,如果您选择此路线,则会将您的访问令牌暴露给闭源第三方服务器。如果您担心这一点,您可以选择使用免费的 ChatGPT 帐户来最大程度地降低风险,或者继续使用官方 OpenAI API 而不是text-davinci-003
模型。
我找到了text-chat-davinci-002
、 text-chat-davinci-002-sh-alpha-aoruigiofdj83
的新工作模型。这是 ChatGPT Plus“Turbo”版本使用的底层模型。响应速度非常快。我已经更新了库以使用此模型。
时机不好; text-chat-davinci-002-sh-alpha-aoruigiofdj83
不久后被删除,可能是由于某个地方出现了新模型?
通过BingAIClient
(实验性)体验 Bing 的 GPT-4 版本 ChatGPT 的强大功能。 API 服务器和CLI 仍需要更新以支持此功能,但您现在可以直接使用客户端。请注意,如果您的帐户仍在等待名单中,您将无法使用该客户端。
尽管text-chat-davinci-002-20221122
再次恢复,但它似乎不断超载并返回 429 错误。 OpenAI 很可能只为该模型投入了少量资源,以防止其被公众广泛使用。此外,我听说较新的版本现在对 OpenAI 员工和合作伙伴进行了访问锁定,因此在模型正式发布之前我们不太可能找到任何解决方法。
您可以使用text-davinci-003
模型作为直接替代品。请记住, text-davinci-003
不如text-chat-davinci-002
(通过 RHLF 训练并微调为对话式 AI),尽管在大多数情况下结果仍然相当不错。请注意,使用text-davinci-003
会消耗您的积分 ($)。
我将为 API 服务器和 CLI 重新添加对基于浏览器的 ChatGPT 的支持。请加注星标并关注此存储库的更新。
过山车已到达下一站。 text-chat-davinci-002-20221122
再次恢复。
尝试将text-chat-davinci-002-20221122
与 OpenAI API 结合使用现在会返回 404 错误。您可以使用text-davinci-003
模型作为直接替代品。请记住, text-davinci-003
不如text-chat-davinci-002
(通过 RHLF 进行训练并微调为对话式 AI),但结果仍然非常好。请注意,使用text-davinci-003
会消耗您的积分 ($)。
当我们调查进一步的解决方法时,请等待进一步的更新。
尝试将text-chat-davinci-002-20230126
与 OpenAI API 结合使用现在会返回 404 错误。有人已经找到了新的型号名称,但他们目前不愿意分享。一旦找到新模型,我将更新此存储库。如果您有任何线索,请提出问题或拉取请求。
与此同时,我添加了对text-davinci-003
等模型的支持,您可以将其用作直接替代品。请记住, text-davinci-003
不如text-chat-davinci-002
(通过 RHLF 训练并微调为对话式 AI),但结果仍然非常好。请注意,使用text-davinci-003
会消耗您的积分 ($)。
Discord 用户 @pig#8932 找到了一个有效的text-chat-davinci-002
模型, text-chat-davinci-002-20221122
。我已经更新了库以使用此模型。
ChatGPT 和 Bing AI 的客户端实现。可用作 Node.js 模块、REST API 服务器和 CLI 应用程序。
ChatGPTClient
:通过 OpenAI 的 API 支持官方 ChatGPT 底层模型gpt-3.5-turbo
。keyv-file
适配器也包含在此包中,如果您使用 API 服务器或 CLI(请参阅settings.example.js
),则可用于将对话存储在 JSON 文件中。text-davinci-003
等模型的支持BingAIClient
:支持 Bing 版本的 ChatGPT,由 GPT-4 提供支持。ChatGPTBrowserClient
:支持 ChatGPT 官方网站,使用反向代理服务器绕过 Cloudflare。npm i @waylaidwanderer/chatgpt-api
请参阅demos/use-bing-client.js
。
请参阅demos/use-client.js
。
请参阅demos/use-browser-client.js
。
您可以使用安装该包
npm i -g @waylaidwanderer/chatgpt-api
然后使用chatgpt-api
运行它。这需要一个可选的--settings=<path_to_settings.js>
参数,或者在当前目录中查找settings.js
(如果未设置),其中包含以下内容:
module . exports = {
// Options for the Keyv cache, see https://www.npmjs.com/package/keyv.
// This is used for storing conversations, and supports additional drivers (conversations are stored in memory by default).
// Only necessary when using `ChatGPTClient`, or `BingAIClient` in jailbreak mode.
cacheOptions : { } ,
// If set, `ChatGPTClient` and `BingAIClient` will use `keyv-file` to store conversations to this JSON file instead of in memory.
// However, `cacheOptions.store` will override this if set
storageFilePath : process . env . STORAGE_FILE_PATH || './cache.json' ,
chatGptClient : {
// Your OpenAI API key (for `ChatGPTClient`)
openaiApiKey : process . env . OPENAI_API_KEY || '' ,
// (Optional) Support for a reverse proxy for the completions endpoint (private API server).
// Warning: This will expose your `openaiApiKey` to a third party. Consider the risks before using this.
// reverseProxyUrl: 'https://chatgpt.hato.ai/completions',
// (Optional) Parameters as described in https://platform.openai.com/docs/api-reference/completions
modelOptions : {
// You can override the model name and any other parameters here.
// The default model is `gpt-3.5-turbo`.
model : 'gpt-3.5-turbo' ,
// Set max_tokens here to override the default max_tokens of 1000 for the completion.
// max_tokens: 1000,
} ,
// (Optional) Davinci models have a max context length of 4097 tokens, but you may need to change this for other models.
// maxContextTokens: 4097,
// (Optional) You might want to lower this to save money if using a paid model like `text-davinci-003`.
// Earlier messages will be dropped until the prompt is within the limit.
// maxPromptTokens: 3097,
// (Optional) Set custom instructions instead of "You are ChatGPT...".
// (Optional) Set a custom name for the user
// userLabel: 'User',
// (Optional) Set a custom name for ChatGPT ("ChatGPT" by default)
// chatGptLabel: 'Bob',
// promptPrefix: 'You are Bob, a cowboy in Western times...',
// A proxy string like "http://<ip>:<port>"
proxy : '' ,
// (Optional) Set to true to enable `console.debug()` logging
debug : false ,
} ,
// Options for the Bing client
bingAiClient : {
// Necessary for some people in different countries, e.g. China (https://cn.bing.com)
host : '' ,
// The "_U" cookie value from bing.com
userToken : '' ,
// If the above doesn't work, provide all your cookies as a string instead
cookies : '' ,
// A proxy string like "http://<ip>:<port>"
proxy : '' ,
// (Optional) Set to true to enable `console.debug()` logging
debug : false ,
} ,
chatGptBrowserClient : {
// (Optional) Support for a reverse proxy for the conversation endpoint (private API server).
// Warning: This will expose your access token to a third party. Consider the risks before using this.
reverseProxyUrl : 'https://bypass.churchless.tech/api/conversation' ,
// Access token from https://chat.openai.com/api/auth/session
accessToken : '' ,
// Cookies from chat.openai.com (likely not required if using reverse proxy server).
cookies : '' ,
// A proxy string like "http://<ip>:<port>"
proxy : '' ,
// (Optional) Set to true to enable `console.debug()` logging
debug : false ,
} ,
// Options for the API server
apiOptions : {
port : process . env . API_PORT || 3000 ,
host : process . env . API_HOST || 'localhost' ,
// (Optional) Set to true to enable `console.debug()` logging
debug : false ,
// (Optional) Possible options: "chatgpt", "chatgpt-browser", "bing". (Default: "chatgpt")
clientToUse : 'chatgpt' ,
// (Optional) Generate titles for each conversation for clients that support it (only ChatGPTClient for now).
// This will be returned as a `title` property in the first response of the conversation.
generateTitles : false ,
// (Optional) Set this to allow changing the client or client options in POST /conversation.
// To disable, set to `null`.
perMessageClientOptionsWhitelist : {
// The ability to switch clients using `clientOptions.clientToUse` will be disabled if `validClientsToUse` is not set.
// To allow switching clients per message, you must set `validClientsToUse` to a non-empty array.
validClientsToUse : [ 'bing' , 'chatgpt' , 'chatgpt-browser' ] , // values from possible `clientToUse` options above
// The Object key, e.g. "chatgpt", is a value from `validClientsToUse`.
// If not set, ALL options will be ALLOWED to be changed. For example, `bing` is not defined in `perMessageClientOptionsWhitelist` above,
// so all options for `bingAiClient` will be allowed to be changed.
// If set, ONLY the options listed here will be allowed to be changed.
// In this example, each array element is a string representing a property in `chatGptClient` above.
chatgpt : [
'promptPrefix' ,
'userLabel' ,
'chatGptLabel' ,
// Setting `modelOptions.temperature` here will allow changing ONLY the temperature.
// Other options like `modelOptions.model` will not be allowed to be changed.
// If you want to allow changing all `modelOptions`, define `modelOptions` here instead of `modelOptions.temperature`.
'modelOptions.temperature' ,
] ,
} ,
} ,
// Options for the CLI app
cliOptions : {
// (Optional) Possible options: "chatgpt", "bing".
// clientToUse: 'bing',
} ,
} ;
或者,您可以直接安装并运行该包。
git clone https://github.com/waylaidwanderer/node-chatgpt-api
npm install
安装依赖项(如果不使用 Docker)settings.example.js
重命名为settings.js
并根据需要更改设置。npm start
或npm run server
(如果不使用 Docker)docker-compose up
(需要 Docker) 开始或继续对话。可选参数仅对于跨越多个请求的对话是必需的。
场地 | 描述 |
---|---|
信息 | 要显示给用户的消息。 |
对话ID | (可选)您想要继续的对话的 ID。 |
越狱会话ID | (可选,仅适用于BingAIClient )设置为true 以在越狱模式下启动对话。之后,这应该是越狱对话的 ID(在响应中作为参数给出,也名为jailbreakConversationId )。 |
父消息ID | (可选,对于越狱模式下的ChatGPTClient 和BingAIClient )继续对话时父消息的 ID(即response.messageId )。 |
对话签名 | (可选,仅适用于BingAIClient )对话的签名(在响应中作为参数给出,也名为conversationSignature )。除非在越狱模式下,否则继续对话时需要。 |
客户端ID | (可选,仅适用于BingAIClient )客户端的 ID。除非在越狱模式下,否则继续对话时需要。 |
调用ID | (可选,仅适用于BingAIClient )调用的 ID。除非在越狱模式下,否则继续对话时需要。 |
客户端选项 | (可选)包含客户端选项的对象。 |
clientOptions.clientToUse | (可选)用于此消息的客户端。可能的值: chatgpt 、 chatgpt-browser 、 bing 。 |
客户端选项。* | (可选)客户端的任何有效选项。例如,对于ChatGPTClient ,您可以设置clientOptions.openaiApiKey 仅为此消息设置 API 密钥,或clientOptions.promptPrefix 仅为该消息提供 AI 自定义指令等。 |
要配置每条消息可以更改哪些选项(默认:全部),请参阅settings.example.js
中perMessageClientOptionsWhitelist
的注释。要允许更改客户端,必须将perMessageClientOptionsWhitelist.validClientsToUse
设置为非空数组,如示例设置文件中所述。
要启动与 ChatGPT 的对话,请将 POST 请求发送到服务器的/conversation
端点,其中包含 JSON 正文,其中包含上面每个端点> POST /conversation 的参数。
{
"message" : " Hello, how are you today? " ,
"conversationId" : " your-conversation-id (optional) " ,
"parentMessageId" : " your-parent-message-id (optional, for `ChatGPTClient` only) " ,
"conversationSignature" : " your-conversation-signature (optional, for `BingAIClient` only) " ,
"clientId" : " your-client-id (optional, for `BingAIClient` only) " ,
"invocationId" : " your-invocation-id (optional, for `BingAIClient` only) " ,
}
服务器将返回一个包含 ChatGPT 响应的 JSON 对象:
// HTTP/1.1 200 OK
{
"response" : "I'm doing well, thank you! How are you?" ,
"conversationId" : "your-conversation-id" ,
"messageId" : "response-message-id (for `ChatGPTClient` only)" ,
"conversationSignature" : "your-conversation-signature (for `BingAIClient` only)" ,
"clientId" : "your-client-id (for `BingAIClient` only)" ,
"invocationId" : "your-invocation-id (for `BingAIClient` only - pass this new value back into subsequent requests as-is)" ,
"details" : "an object containing the raw response from the client"
}
如果请求不成功,服务器将返回一个带有错误消息的 JSON 对象。
如果请求对象缺少必需的属性(例如message
):
// HTTP/1.1 400 Bad Request
{
"error" : "The message parameter is required."
}
如果将消息发送到 ChatGPT 时出错:
// HTTP/1.1 503 Service Unavailable
{
"error" : "There was an error communicating with ChatGPT."
}
您可以在请求正文中设置"stream": true
以接收生成的令牌流。
import { fetchEventSource } from '@waylaidwanderer/fetch-event-source' ; // use `@microsoft/fetch-event-source` instead if in a browser environment
const opts = {
method : 'POST' ,
headers : {
'Content-Type' : 'application/json' ,
} ,
body : JSON . stringify ( {
"message" : "Write a poem about cats." ,
"conversationId" : "your-conversation-id (optional)" ,
"parentMessageId" : "your-parent-message-id (optional)" ,
"stream" : true ,
// Any other parameters per `Endpoints > POST /conversation` above
} ) ,
} ;
有关如何接收生成的响应的示例,请参阅 demos/use-api-server-streaming.js。您一次将收到一个令牌,因此您需要自己将它们连接起来。
成功输出:
{ data : '' , event : '' , id : '' , retry : 3000 }
{ data : 'Hello' , event : '' , id : '' , retry : undefined }
{ data : '!' , event : '' , id : '' , retry : undefined }
{ data : ' How' , event : '' , id : '' , retry : undefined }
{ data : ' can' , event : '' , id : '' , retry : undefined }
{ data : ' I' , event : '' , id : '' , retry : undefined }
{ data : ' help' , event : '' , id : '' , retry : undefined }
{ data : ' you' , event : '' , id : '' , retry : undefined }
{ data : ' today' , event : '' , id : '' , retry : undefined }
{ data : '?' , event : '' , id : '' , retry : undefined }
{ data : '<result JSON here, see Method 1>' , event : 'result' , id : '' , retry : undefined }
{ data : '[DONE]' , event : '' , id : '' , retry : undefined }
// Hello! How can I help you today?
错误输出:
const message = {
data : '{"code":503,"error":"There was an error communicating with ChatGPT."}' ,
event : 'error' ,
id : '' ,
retry : undefined
} ;
if ( message . event === 'error' ) {
console . error ( JSON . parse ( message . data ) . error ) ; // There was an error communicating with ChatGPT.
}
fetch-event-source
并使用POST
方法。按照 API 服务器的相同设置说明进行操作,创建settings.js
。
如果全局安装:
chatgpt-cli
如果本地安装:
npm run cli
ChatGPT 的响应会自动复制到您的剪贴板,以便您可以将它们粘贴到其他应用程序中。
如上面的示例所示,您可以在ChatGPTClient
的选项中设置reverseProxyUrl
以使用反向代理服务器而不是官方ChatGPT API。目前,这是使用 ChatGPT 底层模型的唯一方法。此方法已修补,下面的说明不再相关,但您可能仍出于其他原因想要使用反向代理。目前,反向代理服务器仍用于对ChatGPTBrowserClient
执行 Cloudflare 绕过。
它是如何运作的?简单答案: ChatGPTClient
> 反向代理 > OpenAI 服务器。反向代理服务器在后台做了一些魔法,通过 OpenAI 的服务器直接访问底层模型,然后将响应返回给ChatGPTClient
。
下面提供了说明。
accessToken
属性)。settings.js > chatGptClient
或ChatGPTClient
的选项中将reverseProxyUrl
设置为https://chatgpt.hato.ai/completions
。settings.chatGptClient.openaiApiKey
)设置为您在步骤 1 中获得的 ChatGPT 访问令牌。model
设置为text-davinci-002-render
、 text-davinci-002-render-paid
或text-davinci-002-render-sha
,具体取决于您的帐户有权访问的 ChatGPT 模型。模型必须是 ChatGPT 模型名称,而不是基础模型名称,并且您不能使用您的帐户无权访问的模型。stream: true
(API) 或onProgress
(客户端) 作为解决方法。accessToken
属性)。settings.js > chatGptClient
或ChatGPTClient
的选项中将reverseProxyUrl
设置为https://chatgpt.pawan.krd/api/completions
。settings.chatGptClient.openaiApiKey
)设置为您在步骤 1 中获得的 ChatGPT 访问令牌。model
设置为text-davinci-002-render
、 text-davinci-002-render-paid
或text-davinci-002-render-sha
,具体取决于您的帐户有权访问的 ChatGPT 模型。模型必须是 ChatGPT 模型名称,而不是基础模型名称,并且您不能使用您的帐户无权访问的模型。stream: true
(API) 或onProgress
(客户端) 作为解决方法。使用@waylaidwanderer/chatgpt-api
的精彩项目列表:
通过编辑此自述文件并创建拉取请求将您的添加到列表中!
该项目的网络客户端也可以在 waylaidwanderer/PandoraAI 上找到。
ChatGPTClient
由于gpt-3.5-turbo
是 ChatGPT 的底层模型,因此我必须尽力复制 ChatGPT 官方网站使用它的方式。这意味着我的实现或底层模型在某些方面可能表现不完全相同:
如果您想为此项目做出贡献,请创建一个拉取请求并详细描述您的更改。
该项目根据 MIT 许可证获得许可。