{"id":43098173,"url":"https://github.com/cassiopeiacode/q2api","last_synced_at":"2026-02-11T13:01:32.925Z","repository":{"id":325086114,"uuid":"1099737075","full_name":"CassiopeiaCode/q2api","owner":"CassiopeiaCode","description":"Amazon Q to API Bridge：一个使用 FastAPI 实现的桥接服务，将 Amazon Q Developer 变成兼容 OpenAI Chat Completions 和 Claude Messages 的 API，支持多账号管理、随机负载均衡和流式响应。","archived":false,"fork":false,"pushed_at":"2026-01-17T15:33:40.000Z","size":248,"stargazers_count":219,"open_issues_count":6,"forks_count":138,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-18T00:37:31.694Z","etag":null,"topics":["2api","amazonq","claude","fastapi","new-api","one-api"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/CassiopeiaCode.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-19T11:30:39.000Z","updated_at":"2026-01-17T15:33:43.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/CassiopeiaCode/q2api","commit_stats":null,"previous_names":["cassiopeiacode/q2api"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/CassiopeiaCode/q2api","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CassiopeiaCode%2Fq2api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CassiopeiaCode%2Fq2api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CassiopeiaCode%2Fq2api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CassiopeiaCode%2Fq2api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/CassiopeiaCode","download_url":"https://codeload.github.com/CassiopeiaCode/q2api/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CassiopeiaCode%2Fq2api/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29333155,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-11T12:42:24.625Z","status":"ssl_error","status_checked_at":"2026-02-11T12:41:23.344Z","response_time":97,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["2api","amazonq","claude","fastapi","new-api","one-api"],"created_at":"2026-01-31T17:00:34.633Z","updated_at":"2026-02-11T13:01:32.918Z","avatar_url":"https://github.com/CassiopeiaCode.png","language":"Python","funding_links":[],"categories":["Openai"],"sub_categories":[],"readme":"# Amazon Q to API Bridge - Main Service\n\n## Star History\n\n[![Star History Chart](https://api.star-history.com/svg?repos=CassiopeiaCode/q2api\u0026type=date\u0026legend=top-left)](https://www.star-history.com/#CassiopeiaCode/q2api\u0026type=date\u0026legend=top-left)\n\n将 Amazon Q Developer 转换为兼容 OpenAI 和 Claude API 的服务，支持多账号管理、流式响应和智能负载均衡。\n\n**项目地址：**\n- GitHub: https://github.com/CassiopeiaCode/q2api\n- Codeberg: https://codeberg.org/Korieu/amazonq2api\n\n**致谢：**\n- 感谢 [amq2api](https://github.com/mucsbr/amq2api) 项目提供的 Claude 消息格式转换参考\n\n## ✨ 核心特性\n\n### API 兼容性\n- **OpenAI Chat Completions API** - 完全兼容 `/v1/chat/completions` 端点\n- **Claude Messages API** - 完全兼容 `/v1/messages` 端点，支持流式和非流式\n- **Tool Use 支持** - 完整支持 Claude 格式的工具调用和结果返回\n- **System Prompt** - 支持系统提示词和多模态内容（文本、图片）\n\n### 账号管理\n- **多账号支持** - 管理多个 Amazon Q 账号，灵活启用/禁用\n- **自动令牌刷新** - 后台定时刷新过期令牌，请求时自动重试\n- **智能统计** - 自动统计成功/失败次数，错误超阈值自动禁用\n- **设备授权登录** - 通过 URL 快速登录并自动创建账号（5分钟超时）\n\n### 负载与监控\n- **随机负载均衡** - 从启用的账号中随机选择，均衡分配负载\n- **健康检查** - 实时监控服务状态\n- **Web 控制台** - 美观的前端界面，支持账号管理和 Chat 测试\n\n### 网络与安全\n- **HTTP 代理支持** - 可配置代理服务器，支持所有 HTTP 请求\n- **API Key 白名单** - 可选的访问控制，支持开发模式\n- **持久化存储** - 支持 SQLite（默认）、PostgreSQL、MySQL 数据库\n\n## 🚀 部署\n\n### 方式一：Docker Compose\n\n```bash\n# 1. 复制环境变量配置\ncp .env.example .env\n\n# 2. 编辑 .env 文件（可选）\n# 配置 OPENAI_KEYS、MAX_ERROR_COUNT 等\n\n# 3. 启动服务\ndocker-compose up -d\n\n# 4. 查看日志\ndocker-compose logs -f\n\n# 5. 停止服务\ndocker-compose down\n```\n\n服务访问地址：\n- 🏠 Web 控制台：http://localhost:8000/\n- 💚 健康检查：http://localhost:8000/healthz\n- 📘 API 文档：http://localhost:8000/docs\n\n### 方式二：本地部署\n\n#### 1. 安装依赖\n\n推荐使用 `uv` 进行环境管理和依赖安装。\n\n```bash\n# 安装 uv\npip install uv\n\n# 创建虚拟环境并安装依赖\nuv venv\nuv pip install -r requirements.txt\n```\n\n#### 2. 配置环境变量\n\n```bash\n# 复制示例配置\ncp .env.example .env\n\n# 根据需要编辑 .env 文件\n```\n\n**.env 配置说明：**\n\n```bash\n# 数据库连接URL（留空使用本地SQLite）\n# PostgreSQL: DATABASE_URL=\"postgres://user:password@host:5432/dbname?sslmode=require\"\n# MySQL: DATABASE_URL=\"mysql://user:password@host:3306/dbname\"\nDATABASE_URL=\"\"\n\n# OpenAI 风格 API Key 白名单（仅用于授权，与账号无关）\n# 多个用逗号分隔，例如：OPENAI_KEYS=\"key1,key2,key3\"\n# 留空则为开发模式，不校验 Authorization\nOPENAI_KEYS=\"\"\n\n# Token 计数倍率（影响 /v1/messages/count_tokens 和 /v1/messages 的输入 token 统计）\n# 默认值为 1.0，可根据实际需要调整（如设置为 1.5 表示返回 1.5 倍的 token 数）\nTOKEN_COUNT_MULTIPLIER=\"1.0\"\n\n# 出错次数阈值，超过此值自动禁用账号\nMAX_ERROR_COUNT=100\n\n# HTTP代理设置（留空不使用代理）\n# 例如：HTTP_PROXY=\"http://127.0.0.1:7890\"\nHTTP_PROXY=\"\"\n\n# 管理控制台开关（默认启用）\n# 设置为 \"false\" 或 \"0\" 可禁用管理控制台和相关API端点\nENABLE_CONSOLE=\"true\"\n\n# 管理控制台登录密码（默认 \"admin\"）\n# 用于访问管理控制台的密码，会话有效期为30天\nADMIN_PASSWORD=\"admin\"\n\n# 主服务端口（默认 8000）\nPORT=8000\n```\n\n**配置要点：**\n- `OPENAI_KEYS` 为空：开发模式，不校验 Authorization\n- `OPENAI_KEYS` 设置后：仅白名单中的 key 可访问 API\n- API Key 仅用于访问控制，不映射到特定账号\n- 账号选择策略：从所有启用账号中随机选择\n- `ENABLE_CONSOLE` 设为 `false` 或 `0`：禁用 Web 管理控制台和账号管理 API\n- `ADMIN_PASSWORD`：管理控制台登录密码，默认为 \"admin\"，建议修改为强密码\n\n#### 3. 启动服务\n\n```bash\n# 启动服务 (带热重载)\nuvicorn app:app --host 0.0.0.0 --port 8000 --reload\n```\n\n服务启动后，即可通过 `http://localhost:8000` 访问。该模式适用于开发，修改代码后服务会自动重启。\n\n## 📖 使用指南\n\n### 管理控制台登录\n\n首次访问管理控制台需要登录：\n\n1. 访问 http://localhost:8000/ 将自动跳转到登录页面\n2. 输入管理员密码（默认为 `admin`，可通过 `ADMIN_PASSWORD` 环境变量配置）\n3. 登录成功后，会话有效期为 **30 天**\n4. 会话过期后需要重新登录\n\n**安全建议：**\n- 生产环境务必修改 `ADMIN_PASSWORD` 为强密码\n- 登录凭证存储在浏览器 localStorage 中\n- 所有管理 API 请求需要在 Authorization 头中携带会话 token\n\n### 账号管理\n\n#### 方式一：Web 控制台（推荐）\n\n登录管理控制台后，使用可视化界面：\n- 查看所有账号及详细状态\n- URL 登录（设备授权）快速添加账号\n- 创建/删除/编辑账号\n- 启用/禁用账号切换\n- 手动刷新 Token\n- Chat 功能测试\n\n#### 方式二：URL 登录（最简单）\n\n快速添加账号的推荐方式：\n\n1. **启动登录流程**\n```bash\ncurl -X POST http://localhost:8000/v2/auth/start \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"label\": \"我的账号\", \"enabled\": true}'\n```\n\n2. **在浏览器中打开返回的 `verificationUriComplete` 完成登录**\n\n3. **等待并创建账号**（最多5分钟）\n```bash\ncurl -X POST http://localhost:8000/v2/auth/claim/{authId}\n```\n\n成功后自动创建并启用账号，立即可用。\n\n#### 方式三：REST API 手动管理\n\n**注意：** 所有管理 API 请求需要携带登录凭证（Authorization Bearer Token）\n\n**先登录获取 Token**\n```bash\n# 登录并获取 token\nTOKEN=$(curl -X POST http://localhost:8000/api/login \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"password\": \"admin\"}' \\\n  | jq -r '.token')\n```\n\n**创建账号**\n```bash\ncurl -X POST http://localhost:8000/v2/accounts \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer $TOKEN\" \\\n  -d '{\n    \"label\": \"手动创建的账号\",\n    \"clientId\": \"your-client-id\",\n    \"clientSecret\": \"your-client-secret\",\n    \"refreshToken\": \"your-refresh-token\",\n    \"enabled\": true\n  }'\n```\n\n**列出所有账号**\n```bash\ncurl http://localhost:8000/v2/accounts \\\n  -H \"Authorization: Bearer $TOKEN\"\n```\n\n**更新账号**\n```bash\ncurl -X PATCH http://localhost:8000/v2/accounts/{account_id} \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer $TOKEN\" \\\n  -d '{\"enabled\": false}'\n```\n\n**刷新 Token**\n```bash\ncurl -X POST http://localhost:8000/v2/accounts/{account_id}/refresh \\\n  -H \"Authorization: Bearer $TOKEN\"\n```\n\n**删除账号**\n```bash\ncurl -X DELETE http://localhost:8000/v2/accounts/{account_id} \\\n  -H \"Authorization: Bearer $TOKEN\"\n```\n\n### OpenAI 兼容 API\n\n#### 非流式请求\n\n```bash\ncurl -X POST http://localhost:8000/v1/chat/completions \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer your-api-key\" \\\n  -d '{\n    \"model\": \"claude-sonnet-4\",\n    \"stream\": false,\n    \"messages\": [\n      {\"role\": \"system\", \"content\": \"你是一个乐于助人的助手\"},\n      {\"role\": \"user\", \"content\": \"你好，请讲一个简短的故事\"}\n    ]\n  }'\n```\n\n#### 流式请求（SSE）\n\n```bash\ncurl -N -X POST http://localhost:8000/v1/chat/completions \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer your-api-key\" \\\n  -d '{\n    \"model\": \"claude-sonnet-4\",\n    \"stream\": true,\n    \"messages\": [\n      {\"role\": \"user\", \"content\": \"讲一个笑话\"}\n    ]\n  }'\n```\n\n#### Python 示例\n\n```python\nimport openai\n\nclient = openai.OpenAI(\n    base_url=\"http://localhost:8000/v1\",\n    api_key=\"your-api-key\"  # 如果配置了 OPENAI_KEYS\n)\n\nresponse = client.chat.completions.create(\n    model=\"claude-sonnet-4\",\n    messages=[\n        {\"role\": \"user\", \"content\": \"你好\"}\n    ]\n)\n\nprint(response.choices[0].message.content)\n```\n\n### Claude Messages API\n\n本项目完整支持 Claude Messages API 格式，包括流式响应、工具调用、多模态内容等。\n\n#### 基础文本对话\n\n```bash\ncurl -X POST http://localhost:8000/v1/messages \\\n  -H \"Content-Type: application/json\" \\\n  -H \"x-api-key: your-api-key\" \\\n  -d '{\n    \"model\": \"claude-sonnet-4.5\",\n    \"max_tokens\": 1024,\n    \"messages\": [\n      {\"role\": \"user\", \"content\": \"你好\"}\n    ]\n  }'\n```\n\n#### Python SDK 示例\n\n```python\nfrom anthropic import Anthropic\n\nclient = Anthropic(\n    base_url=\"http://localhost:8000/v1\",\n    api_key=\"your-api-key\"\n)\n\n# 基础对话\nmessage = client.messages.create(\n    model=\"claude-sonnet-4.5\",\n    max_tokens=1024,\n    messages=[\n        {\"role\": \"user\", \"content\": \"你好\"}\n    ]\n)\nprint(message.content[0].text)\n\n# 流式响应\nwith client.messages.stream(\n    model=\"claude-sonnet-4.5\",\n    max_tokens=1024,\n    messages=[\n        {\"role\": \"user\", \"content\": \"写一首诗\"}\n    ]\n) as stream:\n    for text in stream.text_stream:\n        print(text, end=\"\", flush=True)\n```\n\n## 🔐 授权与账号选择\n\n### 授权机制\n- **开发模式**（`OPENAI_KEYS` 未设置）：不校验 Authorization\n- **生产模式**（`OPENAI_KEYS` 已设置）：必须提供白名单中的 key\n\n### 账号选择策略\n- **默认策略**：从所有 `enabled=1` 的账号中**随机选择**\n- **Lazy 号池策略**：启用后，从排序后的前 N 个账号中随机选择，提高性能和账号利用率\n- API Key 不映射到特定账号（与 AWS 账号解耦）\n- 无可用账号时返回 401\n\n### Token 自动刷新\n- **后台刷新**：每5分钟检查一次，超过25分钟未刷新的令牌自动刷新\n- **请求时刷新**：若账号缺少 accessToken，自动刷新后重试\n- **手动刷新**：支持通过 API 或 Web 控制台手动刷新\n\n## 🏗️ 架构设计\n\n### 核心模块\n\n- **app.py** - FastAPI 主应用，RESTful API 端点定义\n- **replicate.py** - Amazon Q 请求复刻\n- **auth_flow.py** - 设备授权登录\n- **claude_types.py** - Claude API 类型定义\n- **claude_converter.py** - Claude 到 Amazon Q 转换\n- **claude_parser.py** - Event Stream 解析\n- **claude_stream.py** - Claude SSE 流式处理\n\n## 📁 项目结构\n\n```\nv2/\n├── app.py                          # FastAPI 主应用\n├── db.py                           # 数据库抽象层 (SQLite/PG/MySQL)\n├── replicate.py                    # Amazon Q 请求复刻\n├── auth_flow.py                    # 设备授权登录\n├── claude_types.py                 # Claude API 类型定义\n├── claude_converter.py             # Claude 到 Amazon Q 转换\n├── claude_parser.py                # Event Stream 解析\n├── claude_stream.py                # Claude SSE 流式处理\n├── requirements.txt                # Python 依赖\n├── .env.example                    # 环境变量示例\n├── .env                            # 环境变量配置（需自行创建）\n├── docker-compose.yml              # Docker Compose 配置\n├── Dockerfile                      # Docker 镜像配置\n├── data.sqlite3                    # SQLite 数据库（自动创建）\n├── templates/\n│   └── streaming_request.json      # Amazon Q 请求模板\n├── frontend/\n│   └── index.html                  # Web 控制台\n└── scripts/\n    ├── account_stats.py            # 账号统计脚本\n    ├── retry_failed_accounts.py    # 重试失败账号脚本\n    └── reset_accounts.py           # 重置账号脚本\n```\n\n## 🛠️ 技术栈\n\n- **后端框架**: FastAPI + Python 3.11+\n- **数据库**: SQLite3 (aiosqlite) / PostgreSQL (asyncpg) / MySQL (aiomysql)\n- **HTTP 客户端**: httpx（支持异步和代理）\n- **Token 计数**: tiktoken\n- **前端**: 纯 HTML/CSS/JavaScript（无依赖）\n- **认证**: AWS OIDC 设备授权流程\n\n## 🔧 高级配置\n\n### 环境变量\n\n| 变量 | 说明 | 默认值 | 示例 |\n|------|------|--------|------|\n| `DATABASE_URL` | 数据库连接URL | 空（使用SQLite） | `\"postgres://user:pass@host:5432/db\"` |\n| `OPENAI_KEYS` | API Key 白名单（逗号分隔） | 空（开发模式） | `\"key1,key2\"` |\n| `TOKEN_COUNT_MULTIPLIER` | Token 计数倍率 | `1.0` | `\"1.5\"` |\n| `MAX_ERROR_COUNT` | 错误次数阈值 | 100 | `50` |\n| `HTTP_PROXY` | HTTP代理地址 | 空 | `\"http://127.0.0.1:7890\"` |\n| `ENABLE_CONSOLE` | 管理控制台开关 | `\"true\"` | `\"false\"` |\n| `ADMIN_PASSWORD` | 管理控制台登录密码 | `\"admin\"` | `\"your-secure-password\"` |\n| `PORT` | 服务端口 | 8000 | `8080` |\n| `DEBUG_MESSAGE_CONVERSION` | 消息转换调试日志 | `\"false\"` | `\"true\"` |\n| `LAZY_ACCOUNT_POOL_ENABLED` | 是否启用 Lazy 号池 | `\"false\"` | `\"true\"` |\n| `LAZY_ACCOUNT_POOL_SIZE` | Lazy 号池大小（聊天） | `20` | `50` |\n| `LAZY_ACCOUNT_POOL_REFRESH_OFFSET` | Lazy 号池刷新偏移量 | `10` | `20` |\n| `LAZY_ACCOUNT_POOL_ORDER_BY` | Lazy 号池排序字段 | `\"created_at\"` | `\"success_count\"` |\n| `LAZY_ACCOUNT_POOL_ORDER_DESC` | Lazy 号池是否降序 | `\"false\"` | `\"true\"` |\n\n### 数据库结构\n\n```sql\nCREATE TABLE accounts (\n    id TEXT PRIMARY KEY,                -- UUID\n    label TEXT,                         -- 账号标签\n    clientId TEXT,                      -- OIDC 客户端 ID\n    clientSecret TEXT,                  -- OIDC 客户端密钥\n    refreshToken TEXT,                  -- 刷新令牌\n    accessToken TEXT,                   -- 访问令牌\n    other TEXT,                         -- JSON 格式的额外信息\n    last_refresh_time TEXT,             -- 最后刷新时间\n    last_refresh_status TEXT,           -- 最后刷新状态\n    created_at TEXT,                    -- 创建时间\n    updated_at TEXT,                    -- 更新时间\n    enabled INTEGER DEFAULT 1,          -- 1=启用, 0=禁用\n    error_count INTEGER DEFAULT 0,      -- 连续错误次数\n    success_count INTEGER DEFAULT 0     -- 成功请求次数\n);\n```\n\n## 📝 完整 API 端点列表\n\n### 管理员认证（需启用 ENABLE_CONSOLE）\n- `POST /api/login` - 管理员登录，获取会话 token\n- `GET /login` - 登录页面\n\n### 账号管理（需启用 ENABLE_CONSOLE，需登录）\n- `POST /v2/accounts` - 创建账号\n- `POST /v2/accounts/feed` - 批量创建账号\n- `GET /v2/accounts` - 列出所有账号\n- `GET /v2/accounts/{id}` - 获取账号详情\n- `PATCH /v2/accounts/{id}` - 更新账号\n- `DELETE /v2/accounts/{id}` - 删除账号\n- `POST /v2/accounts/{id}/refresh` - 刷新 Token\n\n### 设备授权（需启用 ENABLE_CONSOLE，需登录）\n- `POST /v2/auth/start` - 启动登录流程\n- `GET /v2/auth/status/{authId}` - 查询登录状态\n- `POST /v2/auth/claim/{authId}` - 等待并创建账号（最多5分钟）\n\n### OpenAI 兼容\n- `POST /v1/chat/completions` - Chat Completions API\n\n### Claude 兼容\n- `POST /v1/messages` - Messages API（支持流式、工具调用、多模态）\n- `POST /v1/messages/count_tokens` - Token 计数接口（预先统计消息的 token 数量）\n\n### 其他\n- `GET /` - Web 控制台首页（需启用 ENABLE_CONSOLE，需登录）\n- `GET /healthz` - 健康检查\n- `GET /docs` - API 文档（Swagger UI）\n\n## 🐛 故障排查\n\n### 工具调用无限循环\n\n**现象：**\nAI 重复调用相同的工具（如 git、bash 命令），无法停止\n\n**原因：**\n消息历史被错误合并，导致 AI 无法识别已执行的工具调用\n\n**解决方法：**\n1. 此问题已在最新版本中修复\n2. 确保使用最新版本的代码\n3. 如需调试，启用 `DEBUG_MESSAGE_CONVERSION=true`\n4. 详见 [修复文档](docs/FIX_INFINITE_LOOP_CN.md)\n\n### 401 Unauthorized\n**可能原因：**\n- API Key 不在 `OPENAI_KEYS` 白名单中\n- 没有启用的账号（`enabled=1`）\n\n**解决方法：**\n1. 检查 `.env` 中的 `OPENAI_KEYS` 配置\n2. 访问 `/v2/accounts` 确认至少有一个启用的账号\n\n### Token 刷新失败\n**可能原因：**\n- refreshToken 已过期\n- 网络连接问题\n\n**解决方法：**\n1. 查看账号的 `last_refresh_status` 字段\n2. 检查网络连接和代理配置\n3. 删除旧账号，通过 URL 登录重新添加\n\n## 🚀 生产环境部署\n\n### Uvicorn 多进程模式\n\n```bash\n# 使用多个 worker 提高并发性能\npython -m uvicorn app:app --host 0.0.0.0 --port 8000 --workers 4\n```\n\n### Nginx 反向代理\n\n```nginx\nserver {\n    listen 80;\n    server_name your-domain.com;\n\n    location / {\n        proxy_pass http://localhost:8000;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        \n        # SSE 支持\n        proxy_buffering off;\n        proxy_cache off;\n    }\n}\n```\n\n## 🔒 安全建议\n\n1. **生产环境必须修改 `ADMIN_PASSWORD` 为强密码**\n2. **生产环境必须配置 `OPENAI_KEYS`**\n3. **使用 HTTPS 反向代理（Nginx + Let's Encrypt）**\n4. **定期备份数据库**（SQLite: `data.sqlite3`，或 PG/MySQL 数据库）\n5. **限制数据库访问权限**\n6. **配置防火墙规则，限制访问来源**\n7. **管理控制台会话有效期为 30 天，建议定期重新登录**\n\n## 📄 许可证\n\n本项目仅供学习和测试使用。\n\n## 🤝 贡献\n\n欢迎提交 Issue 和 Pull Request！\n\n## 🙏 致谢\n\n- [amq2api](https://github.com/mucsbr/amq2api) - Claude 消息格式转换参考\n- FastAPI - 现代 Python Web 框架\n- Amazon Q Developer - 底层 AI 服务","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcassiopeiacode%2Fq2api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcassiopeiacode%2Fq2api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcassiopeiacode%2Fq2api/lists"}