From 9cb842961368a83581d0b6c36859db3c4e7d135c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=B5=B7=E5=AF=8C?= Date: Tue, 10 Feb 2026 16:41:40 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E7=8E=AF=E5=A2=83?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=E3=80=81=E5=AE=9E=E7=8E=B0=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=20ID=20=E8=A7=A3=E8=80=A6=E8=BD=AC=E6=8D=A2=E5=8F=8A=E5=A2=9E?= =?UTF-8?q?=E5=BC=BA=20Dashboard=20=E4=BA=A4=E4=BA=92=E4=BD=93=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 9 +- README.md | 15 +- README_EN.md | 15 +- TROUBLESHOOTING.md | 23 +- config/config.go | 4 +- models/model_config.go | 69 +++- services/cursor.go | 2 +- start-go-utf8.bat | 19 +- start-go.bat | 19 +- start.sh | 17 +- static/docs.html | 863 +++++++++++++++++++++-------------------- 11 files changed, 592 insertions(+), 463 deletions(-) diff --git a/Dockerfile b/Dockerfile index bac4c4c..61fc87f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # 构建阶段 -FROM golang:1.22-alpine AS builder +FROM golang:1.24-alpine AS builder # 设置工作目录 WORKDIR /app @@ -22,8 +22,8 @@ RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o cursor2api-go . # 运行阶段 FROM alpine:latest -# 安装ca-certificates -RUN apk --no-cache add ca-certificates +# 安装必要依赖 (ca-certificates 用于 HTTPS, nodejs 用于生成认证 Token) +RUN apk --no-cache add ca-certificates nodejs # 创建非root用户 RUN adduser -D -g '' appuser @@ -33,8 +33,9 @@ WORKDIR /root/ # 从构建阶段复制二进制文件 COPY --from=builder /app/cursor2api-go . -# 复制静态文件 +# 复制资源文件 COPY --from=builder /app/static ./static +COPY --from=builder /app/jscode ./jscode # 更改所有者 RUN chown -R appuser:appuser /root/ diff --git a/README.md b/README.md index 45dc45f..e1c4943 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ 一个将 Cursor Web 转换为 OpenAI 兼容 API 的 Go 服务。完全兼容 OpenAI API 格式,支持本地运行。 -[![Go Version](https://img.shields.io/badge/Go-1.21+-blue.svg)](https://golang.org) +[![Go Version](https://img.shields.io/badge/Go-1.24+-blue.svg)](https://golang.org) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) ## ✨ 功能特性 @@ -14,21 +14,20 @@ - ✅ 支持 23 种先进 AI 模型 - ✅ 高性能 Go 语言实现 - ✅ 自动处理 Cursor Web 认证 -- ✅ 简洁的 Web 界面 +- ✅ **全新内置 Dashboard**: 基于 Antigravity 风格的现代化理管理界面 ## 🤖 支持的模型 (23个) -- **OpenAI 系列**: gpt-5.1, gpt-5, gpt-5-codex, gpt-5-mini, gpt-5-nano, gpt-4.1, gpt-4o, o3, o4-mini -- **Claude 系列**: claude-3.5-sonnet, claude-3.5-haiku, claude-3.7-sonnet, claude-4-sonnet, claude-4.5-sonnet, claude-4-opus, claude-4.1-opus -- **Gemini 系列**: gemini-2.5-pro, gemini-2.5-flash, gemini-3.0-pro -- **其他模型**: deepseek-r1, deepseek-v3.1, kimi-k2-instruct, grok-3 +- **Claude 系列**: opus-4.6, sonnet-4.5, claude-3.7-sonnet, claude-4-sonnet, claude-4.5-sonnet, claude-4-opus, claude-3.5-sonnet, claude-3.5-haiku +- **OpenAI 系列**: gpt-5.2-high, codex-5.3-high, composer-1.5, gpt-4o, o3, o4-mini +- **其他系列**: deepseek-r1, gemini-2.5-pro, gemini-2.5-flash ## 🚀 快速开始 ### 环境要求 -- Go 1.21+ -- Node.js 18+ (用于 JavaScript 执行) +- Go 1.24+ +- Node.js 18+ (用于交互式脚本执行) ### 安装和运行 diff --git a/README_EN.md b/README_EN.md index 0dbca64..bd3122e 100644 --- a/README_EN.md +++ b/README_EN.md @@ -4,7 +4,7 @@ English | [简体中文](README.md) A Go service that converts Cursor Web to OpenAI-compatible API. Fully compatible with OpenAI API format, supports local deployment. -[![Go Version](https://img.shields.io/badge/Go-1.21+-blue.svg)](https://golang.org) +[![Go Version](https://img.shields.io/badge/Go-1.24+-blue.svg)](https://golang.org) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) ## ✨ Features @@ -14,21 +14,20 @@ A Go service that converts Cursor Web to OpenAI-compatible API. Fully compatible - ✅ Supports 23 advanced AI models - ✅ High-performance Go implementation - ✅ Automatic Cursor Web authentication -- ✅ Clean web interface +- ✅ **New Built-in Dashboard**: Modernized management interface inspired by Antigravity style ## 🤖 Supported Models (23) -- **OpenAI Series**: gpt-5.1, gpt-5, gpt-5-codex, gpt-5-mini, gpt-5-nano, gpt-4.1, gpt-4o, o3, o4-mini -- **Claude Series**: claude-3.5-sonnet, claude-3.5-haiku, claude-3.7-sonnet, claude-4-sonnet, claude-4.5-sonnet, claude-4-opus, claude-4.1-opus -- **Gemini Series**: gemini-2.5-pro, gemini-2.5-flash, gemini-3.0-pro -- **Other Models**: deepseek-r1, deepseek-v3.1, kimi-k2-instruct, grok-3 +- **Claude Series**: opus-4.6, sonnet-4.5, claude-3.7-sonnet, claude-4-sonnet, claude-4.5-sonnet, claude-4-opus, claude-3.5-sonnet, claude-3.5-haiku +- **OpenAI Series**: gpt-5.2-high, codex-5.3-high, composer-1.5, gpt-4o, o3, o4-mini +- **Other Series**: deepseek-r1, gemini-2.5-pro, gemini-2.5-flash ## 🚀 Quick Start ### Requirements -- Go 1.21+ -- Node.js 18+ (for JavaScript execution) +- Go 1.24+ +- Node.js 18+ (for script execution) ### Installation and Running diff --git a/TROUBLESHOOTING.md b/TROUBLESHOOTING.md index bcb18e8..4db8c3a 100644 --- a/TROUBLESHOOTING.md +++ b/TROUBLESHOOTING.md @@ -96,11 +96,24 @@ export LOG_LEVEL=debug 2. 增加 `timeout` 配置值 3. 检查防火墙设置 -### Token 获取失败 -如果无法获取 `x-is-human` token: -1. 检查 `script_url` 配置是否正确 -2. 确保 `jscode/main.js` 和 `jscode/env.js` 文件存在 -3. 检查 JavaScript 执行环境是否正常 +### Token 获取失败 (404 Not Found) +如果日志显示 `failed to fetch script: script fetch returned status 404`: +1. **检查 SCRIPT_URL**: 确保 `.env` 中的 `SCRIPT_URL` 包含完整的 UUID 路径(不仅仅是 `_app.js`)。你可以通过浏览器抓包 Cursor 官网的 `c.js` 请求来获取最新地址。 +2. **源码完整性**: 确保 `jscode/` 目录中包含 `main.js` 和 `env.js`。 +3. **Docker 映射**: 如果使用 Docker,请确保 `Dockerfile` 中有 `COPY jscode ./jscode` 指令。 + +### UI 仪表盘不更新 +如果你修改了 `static/index.html` 但访问根路径时没有变化: +**原因**: Go 后端在启动时会**预加载** `static/docs.html` 到内存中。 +**解决方案**: +1. 确保修改的是 `static/docs.html` 而不仅仅是 `index.html`。 +2. 必须**重启服务**以清除预加载缓存。 +3. 检查控制台日志是否提示 `预加载文档成功`。 + +### JavaScript 执行错误 (Node.js) +如果报错 `failed to execute JS`: +1. **安装 Node.js**: 该项目需要 `node` 命令来计算人机挑战 Token。 +2. **Docker 环境**: 确保基础镜像(如 Alpine)中安装了 `nodejs`。 ## 联系支持 diff --git a/config/config.go b/config/config.go index 440dbb9..2cbce28 100644 --- a/config/config.go +++ b/config/config.go @@ -48,11 +48,11 @@ func LoadConfig() (*Config, error) { Port: getEnvAsInt("PORT", 8002), Debug: getEnvAsBool("DEBUG", false), APIKey: getEnv("API_KEY", "0000"), - Models: getEnv("MODELS", "gpt-4o,claude-3.5-sonnet"), + Models: getEnv("MODELS", "gpt-5.2-high,claude-opus-4.6,claude-sonnet-4.5,gpt-codex-5.3-high,composer-1.5,gpt-4o,claude-3.5-sonnet,claude-3.5-haiku,claude-3.7-sonnet,claude-4-sonnet,claude-4.5-sonnet,claude-4-opus,claude-4.1-opus,gemini-2.5-pro,gemini-2.5-flash,o3,o4-mini,deepseek-r1"), SystemPromptInject: getEnv("SYSTEM_PROMPT_INJECT", ""), Timeout: getEnvAsInt("TIMEOUT", 30), MaxInputLength: getEnvAsInt("MAX_INPUT_LENGTH", 200000), - ScriptURL: getEnv("SCRIPT_URL", "https://cursor.com/_next/static/chunks/pages/_app.js"), + ScriptURL: getEnv("SCRIPT_URL", "https://cursor.com/149e9513-01fa-4fb0-aad4-566afd725d1b/2d206a39-8ed7-437e-a3be-862e0f06eea3/a-4-a/c.js?i=0&v=3&h=cursor.com"), FP: FP{ UserAgent: getEnv("USER_AGENT", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36"), UNMASKED_VENDOR_WEBGL: getEnv("UNMASKED_VENDOR_WEBGL", "Google Inc. (Intel)"), diff --git a/models/model_config.go b/models/model_config.go index 7f26ab9..ff9733a 100644 --- a/models/model_config.go +++ b/models/model_config.go @@ -2,7 +2,8 @@ package models // ModelConfig 模型配置结构 type ModelConfig struct { - ID string `json:"id"` + ID string `json:"id"` // 外部显示的 ID (OpenAI 兼容) + InternalID string `json:"internal_id"` // Cursor 官方使用的内部 ID Provider string `json:"provider"` MaxTokens int `json:"max_tokens"` ContextWindow int `json:"context_window"` @@ -14,44 +15,72 @@ func GetModelConfigs() map[string]ModelConfig { // OpenAI GPT-5 系列 "gpt-5": { ID: "gpt-5", + InternalID: "gpt-5", Provider: "OpenAI", MaxTokens: 4096, ContextWindow: 400000, }, "gpt-5-codex": { ID: "gpt-5-codex", + InternalID: "gpt-5-codex", Provider: "OpenAI Codex", MaxTokens: 4096, ContextWindow: 192000, }, "gpt-5-mini": { ID: "gpt-5-mini", + InternalID: "gpt-5-mini", Provider: "OpenAI GPT-5 Mini", MaxTokens: 4096, ContextWindow: 400000, }, "gpt-5-nano": { ID: "gpt-5-nano", + InternalID: "gpt-5-nano", Provider: "OpenAI GPT-5 Nano", MaxTokens: 4096, ContextWindow: 400000, }, "gpt-5.1": { ID: "gpt-5.1", + InternalID: "gpt-5.1", Provider: "OpenAI", MaxTokens: 8192, ContextWindow: 1000000, }, + "gpt-5.2-high": { + ID: "gpt-5.2-high", + InternalID: "GPT-5.2 High", + Provider: "OpenAI", + MaxTokens: 16384, + ContextWindow: 2000000, + }, + "gpt-codex-5.3-high": { + ID: "gpt-codex-5.3-high", + InternalID: "Codex 5.3 High", + Provider: "OpenAI Codex", + MaxTokens: 8192, + ContextWindow: 256000, + }, + "composer-1.5": { + ID: "composer-1.5", + InternalID: "Composer 1.5", + Provider: "Cursor Composer", + MaxTokens: 4096, + ContextWindow: 128000, + }, // OpenAI GPT-4 系列 "gpt-4.1": { ID: "gpt-4.1", + InternalID: "gpt-4.1", Provider: "OpenAI GPT-4.1", MaxTokens: 8192, ContextWindow: 1000000, }, "gpt-4o": { ID: "gpt-4o", + InternalID: "gpt-4o", Provider: "OpenAI GPT-4o", MaxTokens: 16384, ContextWindow: 128000, @@ -60,42 +89,63 @@ func GetModelConfigs() map[string]ModelConfig { // Anthropic Claude 系列 "claude-3.5-sonnet": { ID: "claude-3.5-sonnet", + InternalID: "claude-3.5-sonnet", Provider: "Anthropic Claude", MaxTokens: 8192, ContextWindow: 200000, }, + "claude-opus-4.6": { + ID: "claude-opus-4.6", + InternalID: "Opus 4.6", + Provider: "Anthropic Claude", + MaxTokens: 131072, + ContextWindow: 1000000, + }, + "claude-sonnet-4.5": { + ID: "claude-sonnet-4.5", + InternalID: "Sonnet 4.5", + Provider: "Anthropic Claude", + MaxTokens: 16384, + ContextWindow: 1000000, + }, "claude-3.5-haiku": { ID: "claude-3.5-haiku", + InternalID: "claude-3.5-haiku", Provider: "Anthropic Claude", MaxTokens: 4096, ContextWindow: 200000, }, "claude-3.7-sonnet": { ID: "claude-3.7-sonnet", + InternalID: "claude-3.7-sonnet", Provider: "Anthropic Claude", MaxTokens: 8192, ContextWindow: 200000, }, "claude-4-sonnet": { ID: "claude-4-sonnet", + InternalID: "claude-4-sonnet", Provider: "Anthropic Claude", MaxTokens: 8192, ContextWindow: 1000000, }, "claude-4.5-sonnet": { ID: "claude-4.5-sonnet", + InternalID: "claude-4.5-sonnet", Provider: "Anthropic Claude", MaxTokens: 8192, ContextWindow: 1000000, }, "claude-4-opus": { ID: "claude-4-opus", + InternalID: "claude-4-opus", Provider: "Anthropic Claude", MaxTokens: 4096, ContextWindow: 200000, }, "claude-4.1-opus": { ID: "claude-4.1-opus", + InternalID: "claude-4.1-opus", Provider: "Anthropic Claude", MaxTokens: 4096, ContextWindow: 200000, @@ -104,18 +154,21 @@ func GetModelConfigs() map[string]ModelConfig { // Google Gemini 系列 "gemini-2.5-pro": { ID: "gemini-2.5-pro", + InternalID: "gemini-2.5-pro", Provider: "Google Gemini", MaxTokens: 8192, ContextWindow: 1000000, }, "gemini-2.5-flash": { ID: "gemini-2.5-flash", + InternalID: "gemini-2.5-flash", Provider: "Google Gemini", MaxTokens: 8192, ContextWindow: 1000000, }, "gemini-3.0-pro": { ID: "gemini-3.0-pro", + InternalID: "gemini-3.0-pro", Provider: "Google Gemini", MaxTokens: 8192, ContextWindow: 2000000, @@ -124,12 +177,14 @@ func GetModelConfigs() map[string]ModelConfig { // OpenAI O-Series (Reasoning Models need high output limits) "o3": { ID: "o3", + InternalID: "o3", Provider: "OpenAI O-Series", MaxTokens: 65536, ContextWindow: 200000, }, "o4-mini": { ID: "o4-mini", + InternalID: "o4-mini", Provider: "OpenAI O-Series", MaxTokens: 65536, ContextWindow: 200000, @@ -138,12 +193,14 @@ func GetModelConfigs() map[string]ModelConfig { // DeepSeek 系列 "deepseek-r1": { ID: "deepseek-r1", + InternalID: "deepseek-r1", Provider: "DeepSeek", MaxTokens: 8192, ContextWindow: 128000, }, "deepseek-v3.1": { ID: "deepseek-v3.1", + InternalID: "deepseek-v3.1", Provider: "DeepSeek", MaxTokens: 4096, ContextWindow: 128000, @@ -152,6 +209,7 @@ func GetModelConfigs() map[string]ModelConfig { // Moonshot AI "kimi-k2-instruct": { ID: "kimi-k2-instruct", + InternalID: "kimi-k2-instruct", Provider: "Moonshot AI", MaxTokens: 4096, ContextWindow: 256000, @@ -160,6 +218,7 @@ func GetModelConfigs() map[string]ModelConfig { // xAI Grok 系列 "grok-3": { ID: "grok-3", + InternalID: "grok-3", Provider: "xAI Grok", MaxTokens: 8192, ContextWindow: 1000000, @@ -174,6 +233,14 @@ func GetModelConfig(modelID string) (ModelConfig, bool) { return config, exists } +// GetInternalID 获取模型的内部官方名称 +func GetInternalID(modelID string) string { + if config, exists := GetModelConfig(modelID); exists { + return config.InternalID + } + return modelID +} + // GetMaxTokensForModel 获取指定模型的最大token数 func GetMaxTokensForModel(modelID string) int { if config, exists := GetModelConfig(modelID); exists { diff --git a/services/cursor.go b/services/cursor.go index 21642bc..1cd78f9 100644 --- a/services/cursor.go +++ b/services/cursor.go @@ -76,7 +76,7 @@ func (s *CursorService) ChatCompletion(ctx context.Context, request *models.Chat payload := models.CursorRequest{ Context: []interface{}{}, - Model: request.Model, + Model: models.GetInternalID(request.Model), ID: utils.GenerateRandomString(16), Messages: cursorMessages, Trigger: "submit-message", diff --git a/start-go-utf8.bat b/start-go-utf8.bat index ef601fe..5be716c 100644 --- a/start-go-utf8.bat +++ b/start-go-utf8.bat @@ -13,7 +13,7 @@ echo. :: 检查Go是否安装 go version >nul 2>&1 if errorlevel 1 ( - echo ❌ Go 未安装,请先安装 Go 1.21 或更高版本 + echo ❌ Go 未安装,请先安装 Go 1.24 或更高版本 echo 💡 安装方法: https://golang.org/dl/ pause exit /b 1 @@ -37,6 +37,21 @@ if errorlevel 1 ( for /f "delims=" %%i in ('node --version') do set NODE_VERSION=%%i echo ✅ Node.js 版本检查通过: !NODE_VERSION! +:: 检查jscode目录 +if not exist jscode\main.js ( + echo ❌ 缺少 jscode 目录或核心脚本 (main.js) + echo 💡 请确保在源码根目录下执行脚本,并检查 jscode 文件夹是否完整 + pause + exit /b 1 +) +if not exist jscode\env.js ( + echo ❌ 缺少 jscode 目录或核心脚本 (env.js) + echo 💡 请确保在源码根目录下执行脚本,并检查 jscode 文件夹是否完整 + pause + exit /b 1 +) +echo ✅ jscode 依赖检查通过 + :: 创建.env文件(如果不存在) if not exist .env ( echo 📝 创建默认 .env 配置文件... @@ -47,7 +62,7 @@ if not exist .env ( echo. echo # API配置 echo API_KEY=0000 - echo MODELS=gpt-5.1,gpt-5,gpt-5-codex,gpt-5-mini,gpt-5-nano,gpt-4.1,gpt-4o,claude-3.5-sonnet,claude-3.5-haiku,claude-3.7-sonnet,claude-4-sonnet,claude-4.5-sonnet,claude-4-opus,claude-4.1-opus,gemini-2.5-pro,gemini-2.5-flash,gemini-3.0-pro,o3,o4-mini,deepseek-r1,deepseek-v3.1,kimi-k2-instruct,grok-3 + echo MODELS=gpt-5.2-high,opus-4.6,sonnet-4.5,codex-5.3-high,composer-1.5,gpt-4o,claude-3.5-sonnet,claude-3.5-haiku,claude-3.7-sonnet,claude-4-sonnet,claude-4.5-sonnet,claude-4-opus,claude-4.1-opus,gemini-2.5-pro,gemini-2.5-flash,o3,o4-mini,deepseek-r1 echo SYSTEM_PROMPT_INJECT= echo. echo # 请求配置 diff --git a/start-go.bat b/start-go.bat index f5589a1..a3dffcb 100644 --- a/start-go.bat +++ b/start-go.bat @@ -13,7 +13,7 @@ echo. :: 检查Go是否安装 go version >nul 2>&1 if errorlevel 1 ( - echo [错误] Go 未安装,请先安装 Go 1.21 或更高版本 + echo [错误] Go 未安装,请先安装 Go 1.24 或更高版本 echo [提示] 安装方法: https://golang.org/dl/ pause exit /b 1 @@ -37,6 +37,21 @@ if errorlevel 1 ( for /f "delims=" %%i in ('node --version') do set NODE_VERSION=%%i echo [成功] Node.js 版本检查通过: !NODE_VERSION! +:: 检查jscode目录 +if not exist jscode\main.js ( + echo [错误] 缺少 jscode 目录或核心脚本 (main.js) + echo [提示] 请确保在源码根目录下执行脚本,并检查 jscode 文件夹是否完整 + pause + exit /b 1 +) +if not exist jscode\env.js ( + echo [错误] 缺少 jscode 目录或核心脚本 (env.js) + echo [提示] 请确保在源码根目录下执行脚本,并检查 jscode 文件夹是否完整 + pause + exit /b 1 +) +echo [成功] jscode 依赖检查通过 + :: 创建.env文件(如果不存在) if not exist .env ( echo [信息] 创建默认 .env 配置文件... @@ -47,7 +62,7 @@ if not exist .env ( echo. echo # API配置 echo API_KEY=0000 - echo MODELS=gpt-5.1,gpt-5,gpt-5-codex,gpt-5-mini,gpt-5-nano,gpt-4.1,gpt-4o,claude-3.5-sonnet,claude-3.5-haiku,claude-3.7-sonnet,claude-4-sonnet,claude-4.5-sonnet,claude-4-opus,claude-4.1-opus,gemini-2.5-pro,gemini-2.5-flash,gemini-3.0-pro,o3,o4-mini,deepseek-r1,deepseek-v3.1,kimi-k2-instruct,grok-3 + echo MODELS=gpt-5.2-high,claude-opus-4.6,claude-sonnet-4.5,gpt-codex-5.3-high,composer-1.5,gpt-4o,claude-3.5-sonnet,claude-3.5-haiku,claude-3.7-sonnet,claude-4-sonnet,claude-4.5-sonnet,claude-4-opus,claude-4.1-opus,gemini-2.5-pro,gemini-2.5-flash,o3,o4-mini,deepseek-r1 echo SYSTEM_PROMPT_INJECT= echo. echo # 请求配置 diff --git a/start.sh b/start.sh index e907a51..b3ad361 100755 --- a/start.sh +++ b/start.sh @@ -25,13 +25,13 @@ print_header() { # 检查Go环境 check_go() { if ! command -v go &> /dev/null; then - echo -e "${RED}❌ Go 未安装,请先安装 Go 1.21 或更高版本${NC}" + echo -e "${RED}❌ Go 未安装,请先安装 Go 1.24 或更高版本${NC}" echo -e "${YELLOW}💡 安装方法: https://golang.org/dl/${NC}" exit 1 fi GO_VERSION=$(go version | awk '{print $3}' | sed 's/go//') - REQUIRED_VERSION="1.21" + REQUIRED_VERSION="1.24" if [ "$(printf '%s\n' "$REQUIRED_VERSION" "$GO_VERSION" | sort -V | head -n1)" != "$REQUIRED_VERSION" ]; then echo -e "${RED}❌ Go 版本 $GO_VERSION 过低,请安装 Go $REQUIRED_VERSION 或更高版本${NC}" @@ -60,6 +60,16 @@ check_nodejs() { echo -e "${GREEN}✅ Node.js 版本检查通过: $NODE_VERSION${NC}" } +# 检查依赖目录 +check_jscode() { + if [ ! -d "jscode" ] || [ ! -f "jscode/main.js" ] || [ ! -f "jscode/env.js" ]; then + echo -e "${RED}❌ 缺少 jscode 目录或核心脚本 (main.js/env.js)${NC}" + echo -e "${YELLOW}💡 请确保在源码根目录下执行脚本,并检查 jscode 文件夹是否完整${NC}" + exit 1 + fi + echo -e "${GREEN}✅ jscode 依赖检查通过${NC}" +} + # 处理环境配置 setup_env() { if [ ! -f .env ]; then @@ -71,7 +81,7 @@ DEBUG=false # API配置 API_KEY=0000 -MODELS=gpt-5.1,gpt-5,gpt-5-codex,gpt-5-mini,gpt-5-nano,gpt-4.1,gpt-4o,claude-3.5-sonnet,claude-3.5-haiku,claude-3.7-sonnet,claude-4-sonnet,claude-4.5-sonnet,claude-4-opus,claude-4.1-opus,gemini-2.5-pro,gemini-2.5-flash,gemini-3.0-pro,o3,o4-mini,deepseek-r1,deepseek-v3.1,kimi-k2-instruct,grok-3 +MODELS=gpt-5.2-high,claude-opus-4.6,claude-sonnet-4.5,gpt-codex-5.3-high,composer-1.5,gpt-4o,claude-3.5-sonnet,claude-3.5-haiku,claude-3.7-sonnet,claude-4-sonnet,claude-4.5-sonnet,claude-4-opus,claude-4.1-opus,gemini-2.5-pro,gemini-2.5-flash,o3,o4-mini,deepseek-r1 SYSTEM_PROMPT_INJECT= # 请求配置 @@ -123,6 +133,7 @@ main() { print_header check_go check_nodejs + check_jscode setup_env build_app show_info diff --git a/static/docs.html b/static/docs.html index 287ed7b..1bb3ae5 100644 --- a/static/docs.html +++ b/static/docs.html @@ -4,8 +4,31 @@ - Cursor2API - 强大的AI模型API代理 + Cursor2API Dashboard + + -
-
-

🚀 Cursor2API

-

强大的AI模型API代理服务 - OpenAI兼容接口

+
+
+ +

需要身份验证

+

请输入 API Key 以同步模型列表

+ +
+
-
- -