diff --git a/README.en.md b/README.en.md new file mode 100644 index 00000000..c1e6b2bb --- /dev/null +++ b/README.en.md @@ -0,0 +1,284 @@ +

+ 中文 | English +

+ +

+ one-api logo +

+ +
+ +# One API + +_✨ The all-in-one OpenAI interface, integrates various API access methods, ready to use ✨_ + +
+ +

+ + license + + + release + + + docker pull + + + release + + + GoReportCard + +

+ +

+ Deployment Tutorial + · + Usage + · + Feedback + · + Screenshots + · + Live Demo + · + FAQ + · + Related Projects + · + Donate +

+ +> **Warning**: This README is translated by ChatGPT. Please feel free to submit a PR if you find any translation errors. + +> **Note**: The latest image pulled from Docker may be an `alpha` release. Specify the version manually if you require stability. + +> **Warning**: Manual migration of the database is necessary when upgrading from version `v0.3` to `v0.4`. Please manually execute the [database migration script](./bin/migration_v0.3-v0.4.sql). + +## Features +1. Supports multiple API access channels. Welcome PRs or issue submissions for additional channels: + + [x] Official OpenAI channel (support proxy configuration) + + [x] **Azure OpenAI API** + + [x] [OpenAI-SB](https://openai-sb.com) + + [x] [API2D](https://api2d.com/r/197971) + + [x] [OhMyGPT](https://aigptx.top?aff=uFpUl2Kf) + + [x] [AI Proxy](https://aiproxy.io/?i=OneAPI) (invitation code: `OneAPI`) + + [x] [API2GPT](http://console.api2gpt.com/m/00002S) + + [x] [CloseAI](https://console.closeai-asia.com/r/2412) + + [x] [AI.LS](https://ai.ls) + + [x] [OpenAI Max](https://openaimax.com) + + [x] Custom channel: Various third-party proxy services not included in the list +2. Supports access to multiple channels through **load balancing**. +3. Supports **stream mode** that enables typewriter-like effect through stream transmission. +4. Supports **multi-machine deployment**. [See here](#multi-machine-deployment) for more details. +5. Supports **token management** that allows setting token expiration time and usage count. +6. Supports **voucher management** that enables batch generation and export of vouchers. Vouchers can be used for account balance replenishment. +7. Supports **channel management** that allows bulk creation of channels. +8. Supports **user grouping** and **channel grouping** for setting different rates for different groups. +9. Supports channel **model list configuration**. +10. Supports **quota details checking**. +11. Supports **user invite rewards**. +12. Allows display of balance in USD. +13. Supports announcement publishing, recharge link setting, and initial balance setting for new users. +14. Offers rich **customization** options: + 1. Supports customization of system name, logo, and footer. + 2. Supports customization of homepage and about page using HTML & Markdown code, or embedding a standalone webpage through iframe. +15. Supports management API access through system access tokens. +16. Supports Cloudflare Turnstile user verification. +17. Supports user management and multiple user login/registration methods: + + Email login/registration and password reset via email. + + [GitHub OAuth](https://github.com/settings/applications/new). + + WeChat Official Account authorization (requires additional deployment of [WeChat Server](https://github.com/songquanpeng/wechat-server)). +18. Immediate support and encapsulation of other major model APIs as they become available. + +## Deployment +### Docker Deployment +Deployment command: `docker run --name one-api -d --restart always -p 3000:3000 -e TZ=Asia/Shanghai -v /home/ubuntu/data/one-api:/data justsong/one-api` + +Update command: `docker run --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower -cR` + +The first `3000` in `-p 3000:3000` is the port of the host, which can be modified as needed. + +Data will be saved in the `/home/ubuntu/data/one-api` directory on the host. Ensure that the directory exists and has write permissions, or change it to a suitable directory. + +Nginx reference configuration: +``` +server{ + server_name openai.justsong.cn; # Modify your domain name accordingly + + location / { + client_max_body_size 64m; + proxy_http_version 1.1; + proxy_pass http://localhost:3000; # Modify your port accordingly + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_cache_bypass $http_upgrade; + proxy_set_header Accept-Encoding gzip; + } +} +``` + +Next, configure HTTPS with Let's Encrypt certbot: +```bash +# Install certbot on Ubuntu: +sudo snap install --classic certbot +sudo ln -s /snap/bin/certbot /usr/bin/certbot +# Generate certificates & modify Nginx configuration +sudo certbot --nginx +# Follow the prompts +# Restart Nginx +sudo service nginx restart +``` + +The initial account username is `root` and password is `123456`. + +### Manual Deployment +1. Download the executable file from [GitHub Releases](https://github.com/songquanpeng/one-api/releases/latest) or compile from source: + ```shell + git clone https://github.com/songquanpeng/one-api.git + + # Build the frontend + cd one-api/web + npm install + npm run build + + # Build the backend + cd .. + go mod download + go build -ldflags "-s -w" -o one-api + ``` +2. Run: + ```shell + chmod u+x one-api + ./one-api --port 3000 --log-dir ./logs + ``` +3. Access [http://localhost:3000/](http://localhost:3000/) and log in. The initial account username is `root` and password is `123456`. + +For more detailed deployment tutorials, please refer to [this page](https://iamazing.cn/page/how-to-deploy-a-website). + +### Multi-machine Deployment +1. Set the same `SESSION_SECRET` for all servers. +2. Set `SQL_DSN` and use MySQL instead of SQLite. All servers should connect to the same database. +3. Set the `NODE_TYPE` for all non-master nodes to `slave`. +4. Set `SYNC_FREQUENCY` for servers to periodically sync configurations from the database. +5. Non-master nodes can optionally set `FRONTEND_BASE_URL` to redirect page requests to the master server. +6. Install Redis separately on non-master nodes, and configure `REDIS_CONN_STRING` so that the database can be accessed with zero latency when the cache has not expired. +7. If the main server also has high latency accessing the database, Redis must be enabled and `SYNC_FREQUENCY` must be set to periodically sync configurations from the database. + +Please refer to the [environment variables](#environment-variables) section for details on using environment variables. + +### Deployment on Control Panels (e.g., Baota) +Refer to [#175](https://github.com/songquanpeng/one-api/issues/175) for detailed instructions. + +If you encounter a blank page after deployment, refer to [#97](https://github.com/songquanpeng/one-api/issues/97) for possible solutions. + +### Deployment on Third-Party Platforms +
+Deployment on Zeabur +
+ +> Zeabur's servers are located overseas, automatically solving network issues, and the free quota is sufficient for personal usage. + +1. First, fork the code. +2. Go to [Zeabur](https://zeabur.com/), log in, and enter the console. +3. Create a new project. In Service -> Add Service, select Marketplace, and choose MySQL. Note down the connection parameters (username, password, address, and port). +4. Copy the connection parameters and run ```create database `one-api` ``` to create the database. +5. Then, in Service -> Add Service, select Git (authorization is required for the first use) and choose your forked repository. +6. Automatic deployment will start, but please cancel it for now. Go to the Variable tab, add a `PORT` with a value of `3000`, and then add a `SQL_DSN` with a value of `:@tcp(:)/one-api`. Save the changes. Please note that if `SQL_DSN` is not set, data will not be persisted, and the data will be lost after redeployment. +7. Select Redeploy. +8. In the Domains tab, select a suitable domain name prefix, such as "my-one-api". The final domain name will be "my-one-api.zeabur.app". You can also CNAME your own domain name. +9. Wait for the deployment to complete, and click on the generated domain name to access One API. + +
+
+ +## Configuration +The system is ready to use out of the box. + +You can configure it by setting environment variables or command line parameters. + +After the system starts, log in as the `root` user to further configure the system. + +## Usage +Add your API Key on the `Channels` page, and then add an access token on the `Tokens` page. + +You can then use your access token to access One API. The usage is consistent with the [OpenAI API](https://platform.openai.com/docs/api-reference/introduction). + +In places where the OpenAI API is used, remember to set the API Base to your One API deployment address, for example: `https://openai.justsong.cn`. The API Key should be the token generated in One API. + +Note that the specific API Base format depends on the client you are using. + +```mermaid +graph LR + A(User) + A --->|Request| B(One API) + B -->|Relay Request| C(OpenAI) + B -->|Relay Request| D(Azure) + B -->|Relay Request| E(Other downstream channels) +``` + +To specify which channel to use for the current request, you can add the channel ID after the token, for example: `Authorization: Bearer ONE_API_KEY-CHANNEL_ID`. +Note that the token needs to be created by an administrator to specify the channel ID. + +If the channel ID is not provided, load balancing will be used to distribute the requests to multiple channels. + +### Environment Variables +1. `REDIS_CONN_STRING`: When set, Redis will be used as the storage for request rate limiting instead of memory. + + Example: `REDIS_CONN_STRING=redis://default:redispw@localhost:49153` +2. `SESSION_SECRET`: When set, a fixed session key will be used to ensure that cookies of logged-in users are still valid after the system restarts. + + Example: `SESSION_SECRET=random_string` +3. `SQL_DSN`: When set, the specified database will be used instead of SQLite. Please use MySQL version 8.0. + + Example: `SQL_DSN=root:123456@tcp(localhost:3306)/oneapi` +4. `FRONTEND_BASE_URL`: When set, the specified frontend address will be used instead of the backend address. + + Example: `FRONTEND_BASE_URL=https://openai.justsong.cn` +5. `SYNC_FREQUENCY`: When set, the system will periodically sync configurations from the database, with the unit in seconds. If not set, no sync will happen. + + Example: `SYNC_FREQUENCY=60` +6. `NODE_TYPE`: When set, specifies the node type. Valid values are `master` and `slave`. If not set, it defaults to `master`. + + Example: `NODE_TYPE=slave` +7. `CHANNEL_UPDATE_FREQUENCY`: When set, it periodically updates the channel balances, with the unit in minutes. If not set, no update will happen. + + Example: `CHANNEL_UPDATE_FREQUENCY=1440` +8. `CHANNEL_TEST_FREQUENCY`: When set, it periodically tests the channels, with the unit in minutes. If not set, no test will happen. + + Example: `CHANNEL_TEST_FREQUENCY=1440` +9. `REQUEST_INTERVAL`: The time interval (in seconds) between requests when updating channel balances and testing channel availability. Default is no interval. + + Example: `POLLING_INTERVAL=5` + +### Command Line Parameters +1. `--port `: Specifies the port number on which the server listens. Defaults to `3000`. + + Example: `--port 3000` +2. `--log-dir `: Specifies the log directory. If not set, the logs will not be saved. + + Example: `--log-dir ./logs` +3. `--version`: Prints the system version number and exits. +4. `--help`: Displays the command usage help and parameter descriptions. + +## Screenshots +![channel](https://user-images.githubusercontent.com/39998050/233837954-ae6683aa-5c4f-429f-a949-6645a83c9490.png) +![token](https://user-images.githubusercontent.com/39998050/233837971-dab488b7-6d96-43af-b640-a168e8d1c9bf.png) + +## FAQ +1. What is quota? How is it calculated? Does One API have quota calculation issues? + + Quota = Group multiplier * Model multiplier * (number of prompt tokens + number of completion tokens * completion multiplier) + + The completion multiplier is fixed at 1.33 for GPT3.5 and 2 for GPT4, consistent with the official definition. + + If it is not a stream mode, the official API will return the total number of tokens consumed. However, please note that the consumption multipliers for prompts and completions are different. +2. Why does it prompt "insufficient quota" even though my account balance is sufficient? + + Please check if your token quota is sufficient. It is separate from the account balance. + + The token quota is used to set the maximum usage and can be freely set by the user. +3. It says "No available channels" when trying to use a channel. What should I do? + + Please check the user and channel group settings. + + Also check the channel model settings. +4. Channel testing reports an error: "invalid character '<' looking for beginning of value" + + This error occurs when the returned value is not valid JSON but an HTML page. + + Most likely, the IP of your deployment site or the node of the proxy has been blocked by CloudFlare. +5. ChatGPT Next Web reports an error: "Failed to fetch" + + Do not set `BASE_URL` during deployment. + + Double-check that your interface address and API Key are correct. + +## Related Projects +[FastGPT](https://github.com/c121914yu/FastGPT): Build an AI knowledge base in three minutes + +## Note +This project is an open-source project. Please use it in compliance with OpenAI's [Terms of Use](https://openai.com/policies/terms-of-use) and **applicable laws and regulations**. It must not be used for illegal purposes. + +This project is open-sourced under the MIT license. One must somehow retain the copyright information of One API. + +According to the MIT license, users should bear the risk and responsibility of using this project, and the developer of this open-source project is not responsible for this. diff --git a/README.md b/README.md index ed0a397a..f4712561 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,8 @@ +

+ 中文 | English +

+ +

one-api logo