docs(README/cli):更新文档和cli脚本以支持一键配置
This commit is contained in:
@@ -4,6 +4,8 @@ OpenAI Responses API ↔ DeepSeek Chat API 流式转发代理。
|
||||
|
||||
将 OpenAI Codex 等客户端发出的 Responses API 请求,实时转换为 DeepSeek Chat Completions 格式,实现 SSE 流式透传。
|
||||
|
||||
同时支持 使用OpenAI账号登录Codex和不登录纯自定义模式。
|
||||
|
||||
> 妈的,使用Codex,想用DeepSeek接入,找了半天工具,就没发现什么非常好用的工具,协议都不匹配,找到 [Nigel211/codex_deepseek_proxy](https://github.com/Nigel211/codex_deepseek_proxy.git) 但是单文件模式不习惯,使用flask框架也不喜欢,同时在使用中发现模型的对应问题,很头大,没工夫去慢慢研究了,所以重构了fastAPI的版本,后续有空的话会增加其他各路国产模型的适配。
|
||||
|
||||
|
||||
@@ -154,7 +156,7 @@ docker run -d -p 127.0.0.1:12345:12345 \
|
||||
- `Dockerfile` 位于项目根目录,使用 python:3.12-slim 作为构建和运行时基镜像,避免 musl/glibc 不兼容问题
|
||||
- `docker/docker-compose.yml` 位于 `docker/` 目录下,通过 `context: ..` 引用项目根目录的 `Dockerfile` 和 `.env`
|
||||
|
||||
### 5. Docker 部署
|
||||
### 5. Docker 部署 (推荐)
|
||||
#### 拉取镜像
|
||||
|
||||
- 苹果系统M系列芯片
|
||||
@@ -219,11 +221,19 @@ docker run -d \
|
||||
|
||||
## 用法
|
||||
|
||||
### API Endpoints 1
|
||||
### API Endpoints 1(推荐)
|
||||
|
||||
本项目提供了一个简易的命令行接口,用于将配置Codex 的桌面端请求代理到本中转服务
|
||||
|
||||
- 用法1 直接传递参数运行
|
||||
其中,`-u` 参数为代理地址,`-k` 为你的MY_API_KEY,`-t` 为初始化类型(c为custom_init,o为openai_init,分别代表是否使用OpenAI登录)
|
||||
```
|
||||
uv run cli.py -u http://<你的ip>:12345 -k <你设置的MY_API_KEY>
|
||||
uv run cli.py -u http://<你的ip>:12345 -k <你设置的MY_API_KEY> -t <初始化类型(o/c)>
|
||||
```
|
||||
|
||||
- 用法2 启动后交互式输入
|
||||
```
|
||||
uv run cli.py
|
||||
```
|
||||
|
||||
### API Endpoints 2
|
||||
|
||||
@@ -15,7 +15,7 @@ def healthcheck(base_url:str, api_key:str):
|
||||
print(f"Error occurred while checking health: {e}")
|
||||
return False
|
||||
|
||||
def init(base_url:str, api_key:str):
|
||||
def custom_init(base_url:str, api_key:str):
|
||||
if healthcheck(base_url, api_key):
|
||||
try:
|
||||
config = get_config()
|
||||
@@ -23,7 +23,7 @@ def init(base_url:str, api_key:str):
|
||||
|
||||
# 先设置config
|
||||
config.set("model_provider", "custom")
|
||||
config.set("model", "gpt-4.4")
|
||||
config.set("model", "gpt-5.4")
|
||||
config.set("model_reasoning_effort", "high")
|
||||
config.set("disable_response_storage", True)
|
||||
|
||||
@@ -41,13 +41,69 @@ def init(base_url:str, api_key:str):
|
||||
else:
|
||||
return False, "自定义模型提供者不可用,请检查基本URL和API密钥."
|
||||
|
||||
def openai_init(base_url:str, api_key:str):
|
||||
if healthcheck(base_url, api_key):
|
||||
try:
|
||||
config = get_config()
|
||||
auth = get_auth()
|
||||
|
||||
# 先设置config
|
||||
config.set("model_provider", "OpenAI")
|
||||
config.set("model", "gpt-5.4")
|
||||
config.set("model_reasoning_effort", "high")
|
||||
config.set("disable_response_storage", True)
|
||||
|
||||
config.set("model_providers.OpenAI.name", "codex2deepseek")
|
||||
config.set("model_providers.OpenAI.base_url", base_url)
|
||||
config.set("model_providers.OpenAI.wire_api", "responses")
|
||||
config.set("model_providers.OpenAI.experimental_bearer_token", api_key)
|
||||
config.set("model_providers.OpenAI.requires_openai_auth", True)
|
||||
|
||||
|
||||
# 设置auth
|
||||
auth.set("auth_mode", "chatgpt")
|
||||
auth.set("OPENAI_API_KEY", None)
|
||||
return True,"初始化成功,请重启Codex以应用新配置."
|
||||
except Exception as e:
|
||||
return False, f"初始化失败: {str(e)}"
|
||||
else:
|
||||
return False, "自定义模型提供者不可用,请检查基本URL和API密钥."
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 运行参数cli:python -u <base_url> -k <api_key>
|
||||
import argparse
|
||||
parser = argparse.ArgumentParser(description="初始化自定义模型提供者配置。")
|
||||
parser.add_argument("-u", "--base_url", type=str, required=True, help="自定义模型提供者的基本URL。")
|
||||
parser.add_argument("-k", "--api_key", type=str, required=True, help="用于身份验证的API密钥。")
|
||||
parser.add_argument("-u", "--base_url", type=str, required=False, help="自定义模型提供者的基本URL。")
|
||||
parser.add_argument("-k", "--api_key", type=str, required=False, help="用于身份验证的API密钥。")
|
||||
parser.add_argument("-t", "--type", type=str, required=False, help="初始化类型,可选值:openai(o),custom(c)")
|
||||
args = parser.parse_args()
|
||||
success, message = init(args.base_url, args.api_key)
|
||||
parameters = {}
|
||||
if not args.base_url or not args.api_key or not args.type:
|
||||
print("请选择初始化类型:1. OpenAI(使用OpenAI登录Codex|可以保留一定的登录后才能使用的功能) 2. Custom(直接输入基本URL和API密钥、无法使用登录后的一些功能)")
|
||||
input_type = input("请输入初始化类型(1/2):").strip().lower()
|
||||
if input_type == "1":
|
||||
parameters["type"] = "o"
|
||||
elif input_type == "2":
|
||||
parameters["type"] = "c"
|
||||
print("请输入基本URL:")
|
||||
parameters["base_url"] = input().strip()
|
||||
print("请输入API密钥:")
|
||||
parameters["api_key"] = input().strip()
|
||||
if parameters["type"] == "o" or parameters["type"] == "openai":
|
||||
success, message = openai_init(parameters["base_url"], parameters["api_key"])
|
||||
elif parameters["type"] == "c" or parameters["type"] == "custom":
|
||||
success, message = custom_init(parameters["base_url"], parameters["api_key"])
|
||||
else:
|
||||
print("无效的初始化类型。")
|
||||
exit(1)
|
||||
print(message)
|
||||
exit(0)
|
||||
|
||||
if args.type == "o" or args.type == "openai":
|
||||
success, message = openai_init(args.base_url, args.api_key)
|
||||
elif args.type == "c" or args.type == "custom":
|
||||
success, message = custom_init(args.base_url, args.api_key)
|
||||
else:
|
||||
print("无效的初始化类型。")
|
||||
exit(1)
|
||||
print(message)
|
||||
Reference in New Issue
Block a user