# go-chatgpt-api
### [中文文档](README.md)
## A forward proxy program attempting to bypass `Cloudflare 403` and `Access Denied`.
### Experimental project, with no guarantee of stability and backward compatibility, use at your own risk.
---
### Troubleshooting
English countries does not have the "Great Firewall", so many issues are gone.
More details: https://github.com/linweiyuan/go-chatgpt-api/issues/74
---
### Supported APIs (URL and parameters are mostly consistent with the official website, with slight modifications to some interfaces).
---
## ChatGPT APIs
---
- `ChatGPT` user login (`accessToken` will be returned) (currently `Google` or `Microsoft` accounts are not supported).
`POST /chatgpt/login`
```json
{
"username": "email",
"password": "password"
}
```
---
- get conversation list
`GET /chatgpt/conversations?offset=0&limit=20`
`offset` defaults to 0, `limit` defaults to 20 (max 100).
---
- get conversation content
`GET /chatgpt/conversation/{conversationID}`
---
- create conversation
`POST /chatgpt/conversation`
```json
{
"action": "next",
"messages": [
{
"id": "message id",
"author": {
"role": "user"
},
"content": {
"content_type": "text",
"parts": [
"Hello World"
]
}
}
],
"parent_message_id": "parent message id",
"conversation_id": "conversation id",
"model": "text-davinci-002-render-sha",
"timezone_offset_min": -480,
"history_and_training_disabled": false
}
```
---
- generate conversation title
`POST /chatgpt/conversation/gen_title/{conversationID}`
```json
{
"message_id": "role assistant response message id"
}
```
---
- rename conversation
`PATCH /chatgpt/conversation/{conversationID}`
```json
{
"title": "new title"
}
```
---
- delete conversation
`PATCH /chatgpt/conversation/{conversationID}`
```json
{
"is_visible": false
}
```
---
- delete all conversations
`PATCH /chatgpt/conversations`
```json
{
"is_visible": false
}
```
---
- feedback message
`POST /chatgpt/conversation/message_feedback`
```json
{
"message_id": "message id",
"conversation_id": "conversation id",
"rating": "thumbsUp/thumbsDown"
}
```
---
## Platform APIs
---
- `platform` user login (`sessionKey` will be returned)
`POST /platform/login`
```json
{
"username": "email",
"password": "password"
}
```
---
- [List models](https://platform.openai.com/docs/api-reference/models/list)
`GET /platform/v1/models`
---
- [Retrieve model](https://platform.openai.com/docs/api-reference/models/retrieve)
`GET /platform/v1/models/{model}`
---
- [Create completion](https://platform.openai.com/docs/api-reference/completions/create)
`POST /platform/v1/completions`
```json
{
"model": "text-davinci-003",
"prompt": "Say this is a test",
"max_tokens": 7,
"temperature": 0,
"stream": true
}
```
---
- [Create chat completion](https://platform.openai.com/docs/api-reference/chat/create)
`POST /platform/v1/chat/completions`
```json
{
"messages": [
{
"role": "user",
"content": "Hello World"
}
],
"model": "gpt-3.5-turbo",
"stream": true
}
```
---
- [Create edit](https://platform.openai.com/docs/api-reference/edits/create)
`POST /platform/v1/edits`
```json
{
"model": "text-davinci-edit-001",
"input": "What day of the wek is it?",
"instruction": "Fix the spelling mistakes"
}
```
---
- [Create image](https://platform.openai.com/docs/api-reference/images/create)
`POST /platform/v1/images/generations`
```json
{
"prompt": "A cute dog",
"n": 2,
"size": "1024x1024"
}
```
---
- [Create embeddings](https://platform.openai.com/docs/api-reference/embeddings/create)
`POST /platform/v1/embeddings`
```json
{
"model": "text-embedding-ada-002",
"input": "The food was delicious and the waiter..."
}
```
---
- [Create moderations](https://platform.openai.com/docs/api-reference/moderations/create)
`POST /platform/v1/moderations`
```json
{
"model": "text-moderation-stable",
"input": "I want to kill them."
}
```
---
- [List files](https://platform.openai.com/docs/api-reference/files/list)
`GET /platform/v1/files`
---
- get `credit grants` (only support `sessionkey`)
`GET /platform/dashboard/billing/credit_grants`
---
- get `subscription` (only support `sessionkey`)
`GET /platform/dashboard/billing/subscription`
---
- get `api keys` (only support `sessionkey`)
`GET /platform/dashboard/user/api_keys`
---
### Configuration
To set a proxy, you can use the environment variable `GO_CHATGPT_API_PROXY`, such
as `GO_CHATGPT_API_PROXY=http://127.0.0.1:20171` or `GO_CHATGPT_API_PROXY=socks5://127.0.0.1:20170`. If it is commented
out or left blank, it will not be enabled.
To use with `warp`: `GO_CHATGPT_API_PROXY=socks5://chatgpt-proxy-server-warp:65535`. Since the scenario that requires
setting up `warp` can directly access the `ChatGPT` website by default, using the same variable will not cause
conflicts.
---
`docker-compose.yaml`:
```yaml
services:
go-chatgpt-api:
container_name: go-chatgpt-api
image: linweiyuan/go-chatgpt-api
ports:
- 8080:8080
environment:
- GO_CHATGPT_API_PROXY=
restart: unless-stopped
```
I only develop and test on `Arch Linux`, which is a `rolling` release version, meaning that everything on the system is
`up-to-date`. If you encounter a `yaml` error while using it, you can add `version: '3'` in front of `services:`.
If you encounter an `Access denied` error, but your server is indeed
in [Supported countries and territories](https://platform.openai.com/docs/supported-countries), try this
configuration (it is not guaranteed to solve the problem, for example, if your server is in `Zone A`, but `Zone A`
is not on the list of supported countries, even if you use `warp` to change to a `Cloudflare IP`, the result will still
be
`403`):
```yaml
services:
go-chatgpt-api:
container_name: go-chatgpt-api
image: linweiyuan/go-chatgpt-api
ports:
- 8080:8080
environment:
- GO_CHATGPT_API_PROXY=socks5://chatgpt-proxy-server-warp:65535
depends_on:
- chatgpt-proxy-server-warp
restart: unless-stopped
chatgpt-proxy-server-warp:
container_name: chatgpt-proxy-server-warp
image: linweiyuan/chatgpt-proxy-server-warp
environment:
- LOG_LEVEL=OFF
restart: unless-stopped
```
If you know what `teams-enroll-token` is and want to set its value, you can do so through the environment
variable `TEAMS_ENROLL_TOKEN`.
Run this command to check the result:
`docker-compose exec chatgpt-proxy-server-warp warp-cli --accept-tos account | awk 'NR==1'`
```
Account type: Free (wrong)
Account type: Team (correct)
```
---
If you want to make sure the image is always latest, try this:
```yaml
services:
watchtower:
container_name: watchtower
image: containrrr/watchtower
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command: --interval 3600
restart: unless-stopped
```
AD
`Vultr` Referral Program: https://www.vultr.com/?ref=7372562