From 4faddb390c38aeb22725e7df49288b99c60ecb1b Mon Sep 17 00:00:00 2001 From: Pine Date: Wed, 27 May 2026 11:55:12 +0800 Subject: [PATCH] =?UTF-8?q?docs(README/cli)=EF=BC=9A=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E5=92=8Ccli=E8=84=9A=E6=9C=AC=E4=BB=A5?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E4=B8=80=E9=94=AE=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 16 +++++++++++--- cli.py | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 74 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 3367bb2..9b102f8 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/cli.py b/cli.py index 7c24205..91605e3 100644 --- a/cli.py +++ b/cli.py @@ -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 -k 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) \ No newline at end of file