Files

1 line
24 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"repo": "a4308280-svg/ds2api-browser", "files": {"README.md": {"5cba26796346138fd45a286c30781b2e3deb0c4a": {"t": 1785746539.410531, "n": 2955, "h": "8031a302cf3bcbae", "c": "# DS2API Browser\n\n基于 CloakBrowser 的 DeepSeek API 代理服务。\n\n## 为什么选择 CloakBrowser?\n\nCloakBrowser 是专为反检测设计的浏览器,通过 30/30 机器人检测测试。使用 CloakBrowser 可以:\n\n- **完全隐藏自动化痕迹** - 无法被 DeepSeek 检测\n- **避免账号封禁** - 模拟真实用户行为\n- **通过 AWS WAF 验证** - 自动处理 CloudFront Token\n\n## 特性\n\n- **浏览器自动化** - 使用 CloakBrowser 访问 DeepSeek,无法被检测\n- **OpenAI 兼容 API** - 支持 `/v1/chat/completions` 接口\n- **Claude/Gemini/Ollama 兼容** - 多协议支持\n- **流式响应** - 支持 SSE 流式输出\n- **账号池管理** - 支持多账号轮询\n- **Web 管理界面** - 在线导入账号\n\n## 安装\n\n```bash\n# 克隆仓库\ngit clone https://github.com/huanxherta/ds2api-browser.git\ncd ds2api-browser\n\n# 创建虚拟环境\npython -m venv venv\nsource venv/bin/activate\n\n# 安装依赖\npip install -r requirements.txt\n```\n\n## 使用\n\n### 方式 1: 环境变量配置\n\n```bash\nexport DS2API_ACCOUNTS=\"email1@gmail.com:password1;email2@gmail.com:password2\"\nexport DS2API_KEYS=\"sk-key1,sk-key2\"\nexport DS2API_ADMIN_KEY=\"your-admin-key\"\nexport DS2API_PORT=\"5001\"\nexport DS2API_HEADLESS=\"true\"\n\npython main.py\n```\n\n### 方式 2: 直接运行\n\n```bash\npython start.py\n```\n\n### 方式 3: 后台运行\n\n```bash\nnohup python main.py > /tmp/ds2api-browser.log 2>&1 &\n```\n\n## Web 管理界面\n\n访问 `http://localhost:5001/test.html` 可以:\n\n- 测试 API 请求\n- 导入账号(支持批量)\n- 查看账号状态\n\n## API 使用\n\n### 聊天补全\n\n```bash\ncurl http://localhost:5001/v1/chat/completions \\\n -H \"Authorization: Bearer sk-test123456\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"model\": \"deepseek-v4-flash\",\n \"messages\": [{\"role\": \"user\", \"content\": \"Hello!\"}]\n }'\n```\n\n### 流式响应\n\n```bash\ncurl http://localhost:5001/v1/chat/completions \\\n -H \"Authorization: Bearer sk-test123456\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"model\": \"deepseek-v4-flash\",\n \"messages\": [{\"role\": \"user\", \"content\": \"Hello!\"}],\n \"stream\": true\n }'\n```\n\n### Python OpenAI SDK\n\n```python\nfrom openai import OpenAI\n\nclient = OpenAI(\n base_url=\"http://localhost:5001/v1\",\n api_key=\"sk-test123456\"\n)\n\nresponse = client.chat.completions.create(\n model=\"deepseek-v4-flash\",\n messages=[{\"role\": \"user\", \"content\": \"Hello!\"}]\n)\nprint(response.choices[0].message.content)\n```\n\n## 支持的模型\n\n| 模型 ID | 说明 |\n|---------|------|\n| deepseek-v4-flash | 快速模式(默认) |\n| deepseek-v4-pro | 专家模式 |\n| deepseek-v4-flash-search | 快速 + 搜索 |\n| deepseek-v4-pro-search | 专家 + 搜索 |\n| deepseek-chat | 兼容原版 DS2API |\n| deepseek-reasoner | 推理模式 |\n\n## 健康检查\n\n```bash\n# 健康检查\ncurl http://localhost:5001/healthz\n\n# 就绪检查\ncurl http://localhost:5001/readyz\n\n# 管理统计\ncurl http://localhost:5001/admin/stats -H \"admin-key: admin\"\n```\n\n## 注意事项\n\n1. **必须使用 CloakBrowser** - 其他浏览器(如原生 Playwright)会被检测\n2. **资源占用** - 每个浏览器实例占用约 200-500MB 内存\n3. **性能** - 浏览器自动化比直接 HTTP 慢,但更安全\n4. **账号安全** - 建议使用小号测试,不要用主账号\n\n## 文件结构\n\n```\nds2api-browser/\n├── main.py # FastAPI 服务器\n├── deepseek_browser.py # CloakBrowser 自动化核心\n├── account_manager.py # 账号池管理\n├── config.py # 配置管理\n├── start.py # 快速启动脚本\n├── run.py # 运行入口\n├── test.html # Web 管理界面\n├── requirements.txt # 依赖列表\n└── README.md # 本文档\n```\n"}, "2c5b7089b2329ff395f02c6cecd95055227651ba": {"t": 1785765461.4342847, "n": 2955, "h": "8031a302cf3bcbae", "c": "# DS2API Browser\n\n基于 CloakBrowser 的 DeepSeek API 代理服务。\n\n## 为什么选择 CloakBrowser?\n\nCloakBrowser 是专为反检测设计的浏览器,通过 30/30 机器人检测测试。使用 CloakBrowser 可以:\n\n- **完全隐藏自动化痕迹** - 无法被 DeepSeek 检测\n- **避免账号封禁** - 模拟真实用户行为\n- **通过 AWS WAF 验证** - 自动处理 CloudFront Token\n\n## 特性\n\n- **浏览器自动化** - 使用 CloakBrowser 访问 DeepSeek,无法被检测\n- **OpenAI 兼容 API** - 支持 `/v1/chat/completions` 接口\n- **Claude/Gemini/Ollama 兼容** - 多协议支持\n- **流式响应** - 支持 SSE 流式输出\n- **账号池管理** - 支持多账号轮询\n- **Web 管理界面** - 在线导入账号\n\n## 安装\n\n```bash\n# 克隆仓库\ngit clone https://github.com/huanxherta/ds2api-browser.git\ncd ds2api-browser\n\n# 创建虚拟环境\npython -m venv venv\nsource venv/bin/activate\n\n# 安装依赖\npip install -r requirements.txt\n```\n\n## 使用\n\n### 方式 1: 环境变量配置\n\n```bash\nexport DS2API_ACCOUNTS=\"email1@gmail.com:password1;email2@gmail.com:password2\"\nexport DS2API_KEYS=\"sk-key1,sk-key2\"\nexport DS2API_ADMIN_KEY=\"your-admin-key\"\nexport DS2API_PORT=\"5001\"\nexport DS2API_HEADLESS=\"true\"\n\npython main.py\n```\n\n### 方式 2: 直接运行\n\n```bash\npython start.py\n```\n\n### 方式 3: 后台运行\n\n```bash\nnohup python main.py > /tmp/ds2api-browser.log 2>&1 &\n```\n\n## Web 管理界面\n\n访问 `http://localhost:5001/test.html` 可以:\n\n- 测试 API 请求\n- 导入账号(支持批量)\n- 查看账号状态\n\n## API 使用\n\n### 聊天补全\n\n```bash\ncurl http://localhost:5001/v1/chat/completions \\\n -H \"Authorization: Bearer sk-test123456\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"model\": \"deepseek-v4-flash\",\n \"messages\": [{\"role\": \"user\", \"content\": \"Hello!\"}]\n }'\n```\n\n### 流式响应\n\n```bash\ncurl http://localhost:5001/v1/chat/completions \\\n -H \"Authorization: Bearer sk-test123456\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"model\": \"deepseek-v4-flash\",\n \"messages\": [{\"role\": \"user\", \"content\": \"Hello!\"}],\n \"stream\": true\n }'\n```\n\n### Python OpenAI SDK\n\n```python\nfrom openai import OpenAI\n\nclient = OpenAI(\n base_url=\"http://localhost:5001/v1\",\n api_key=\"sk-test123456\"\n)\n\nresponse = client.chat.completions.create(\n model=\"deepseek-v4-flash\",\n messages=[{\"role\": \"user\", \"content\": \"Hello!\"}]\n)\nprint(response.choices[0].message.content)\n```\n\n## 支持的模型\n\n| 模型 ID | 说明 |\n|---------|------|\n| deepseek-v4-flash | 快速模式(默认) |\n| deepseek-v4-pro | 专家模式 |\n| deepseek-v4-flash-search | 快速 + 搜索 |\n| deepseek-v4-pro-search | 专家 + 搜索 |\n| deepseek-chat | 兼容原版 DS2API |\n| deepseek-reasoner | 推理模式 |\n\n## 健康检查\n\n```bash\n# 健康检查\ncurl http://localhost:5001/healthz\n\n# 就绪检查\ncurl http://localhost:5001/readyz\n\n# 管理统计\ncurl http://localhost:5001/admin/stats -H \"admin-key: admin\"\n```\n\n## 注意事项\n\n1. **必须使用 CloakBrowser** - 其他浏览器(如原生 Playwright)会被检测\n2. **资源占用** - 每个浏览器实例占用约 200-500MB 内存\n3. **性能** - 浏览器自动化比直接 HTTP 慢,但更安全\n4. **账号安全** - 建议使用小号测试,不要用主账号\n\n## 文件结构\n\n```\nds2api-browser/\n├── main.py # FastAPI 服务器\n├── deepseek_browser.py # CloakBrowser 自动化核心\n├── account_manager.py # 账号池管理\n├── config.py # 配置管理\n├── start.py # 快速启动脚本\n├── run.py # 运行入口\n├── test.html # Web 管理界面\n├── requirements.txt # 依赖列表\n└── README.md # 本文档\n```\n"}, "f6a18fc897b624735ef7f5e263e7a7ef186c6ff2": {"t": 1785765463.0319097, "n": 2578, "h": "ff1f389ad2857928", "c": "# DS2API Browser\n\n基于 CloakBrowser/Playwright 的 DeepSeek API 代理服务。\n\n## 特性\n\n- **浏览器自动化** - 使用真实浏览器访问 DeepSeek,无法被检测\n- **OpenAI 兼容 API** - 支持 `/v1/chat/completions` 接口\n- **流式响应** - 支持 SSE 流式输出\n- **账号池管理** - 支持多账号轮询\n- **人类行为模拟** - 模拟真实用户操作\n\n## 安装\n\n```bash\ncd /home/huanx/code/ds2api-browser\npython -m venv venv\nsource venv/bin/activate\npip install -r requirements.txt\n\n# 安装 Playwright 浏览器(如果不用 CloakBrowser)\nplaywright install chromium\n```\n\n## 使用\n\n### 方式 1: 环境变量配置\n\n```bash\nexport DS2API_ACCOUNTS=\"email1@gmail.com:password1;email2@gmail.com:password2\"\nexport DS2API_KEYS=\"sk-key1,sk-key2\"\nexport DS2API_ADMIN_KEY=\"your-admin-key\"\nexport DS2API_PORT=\"5001\"\nexport DS2API_HEADLESS=\"true\"\nexport DS2API_HUMANIZE=\"true\"\n\npython main.py\n```\n\n### 方式 2: 直接运行\n\n```bash\npython start.py\n```\n\n### 方式 3: 后台运行\n\n```bash\nnohup python main.py > /tmp/ds2api-browser.log 2>&1 &\n```\n\n## API 使用\n\n### 聊天补全\n\n```bash\ncurl http://localhost:5001/v1/chat/completions \\\n -H \"Authorization: Bearer sk-test123456\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"model\": \"deepseek-chat\",\n \"messages\": [{\"role\": \"user\", \"content\": \"Hello!\"}]\n }'\n```\n\n### 流式响应\n\n```bash\ncurl http://localhost:5001/v1/chat/completions \\\n -H \"Authorization: Bearer sk-test123456\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"model\": \"deepseek-chat\",\n \"messages\": [{\"role\": \"user\", \"content\": \"Hello!\"}],\n \"stream\": true\n }'\n```\n\n### Python OpenAI SDK\n\n```python\nfrom openai import OpenAI\n\nclient = OpenAI(\n base_url=\"http://localhost:5001/v1\",\n api_key=\"sk-test123456\"\n)\n\nresponse = client.chat.completions.create(\n model=\"deepseek-chat\",\n messages=[{\"role\": \"user\", \"content\": \"Hello!\"}]\n)\nprint(response.choices[0].message.content)\n```\n\n## 健康检查\n\n```bash\n# 健康检查\ncurl http://localhost:5001/healthz\n\n# 就绪检查\ncurl http://localhost:5001/readyz\n\n# 管理统计\ncurl http://localhost:5001/admin/stats -H \"admin-key: admin\"\n```\n\n## 与原版 DS2API 的区别\n\n| 特性 | 原版 DS2API | DS2API Browser |\n|------|-------------|----------------|\n| 实现方式 | HTTP 客户端 | 浏览器自动化 |\n| 指纹检测 | 容易被检测 | 无法被检测 |\n| 账号封禁 | 高风险 | 低风险 |\n| 性能 | 快 | 较慢 |\n| 资源占用 | 低 | 高 |\n\n## 注意事项\n\n1. **首次运行** - Playwright/CloakBrowser 会下载浏览器二进制文件(~200MB)\n2. **资源占用** - 每个浏览器实例占用约 200-500MB 内存\n3. **性能** - 浏览器自动化比直接 HTTP 慢,但更安全\n4. **账号安全** - 建议使用小号测试,不要用主账号\n\n## 文件结构\n\n```\nds2api-browser/\n├── main.py # FastAPI 服务器\n├── deepseek_browser.py # 浏览器自动化核心\n├── account_manager.py # 账号池管理\n├── config.py # 配置管理\n├── start.py # 快速启动脚本\n├── run.py # 运行入口\n├── requirements.txt # 依赖列表\n└── README.md # 本文档\n```\n"}}, "proxy.py": {"5cba26796346138fd45a286c30781b2e3deb0c4a": {"t": 1785746577.4712129, "n": 11551, "h": "317193c1176f92bc", "c": "import json\nimport time\nimport uuid\nfrom typing import Optional\n\nimport httpx\nfrom fastapi import FastAPI, HTTPException, Header, Request\nfrom fastapi.middleware.cors import CORSMiddleware\nfrom fastapi.responses import StreamingResponse\nfrom pydantic import BaseModel\n\napp = FastAPI(title=\"DS2API Browser Proxy\")\n\napp.add_middleware(\n CORSMiddleware,\n allow_origins=[\"*\"],\n allow_credentials=True,\n allow_methods=[\"*\"],\n allow_headers=[\"*\"],\n)\n\nDS2API_URL = \"http://127.0.0.1:5001\"\nAPI_KEYS = [\"sk-default\", \"sk-test123456\"]\nADMIN_KEY = \"admin\"\n\n\nclass Message(BaseModel):\n role: str\n content: str\n\n\nclass ChatCompletionRequest(BaseModel):\n model: str\n messages: list[Message]\n stream: bool = False\n temperature: Optional[float] = None\n max_tokens: Optional[int] = None\n\n\ndef verify_api_key(authorization: Optional[str] = Header(None)) -> str:\n if not authorization:\n raise HTTPException(status_code=401, detail=\"Missing API key\")\n\n token = authorization.replace(\"Bearer \", \"\").strip()\n if token not in API_KEYS:\n raise HTTPException(status_code=401, detail=\"Invalid API key\")\n\n return token\n\n\n@app.get(\"/v1/models\")\nasync def list_models(authorization: str = Header(...)):\n verify_api_key(authorization)\n \n async with httpx.AsyncClient() as client:\n resp = await client.get(f\"{DS2API_URL}/v1/models\", headers={\"Authorization\": f\"Bearer sk-test123456\"})\n return resp.json()\n\n\n@app.get(\"/v1/models/{model_id}\")\nasync def get_model(model_id: str, authorization: str = Header(...)):\n verify_api_key(authorization)\n \n async with httpx.AsyncClient() as client:\n resp = await client.get(f\"{DS2API_URL}/v1/models/{model_id}\", headers={\"Authorization\": f\"Bearer sk-test123456\"})\n return resp.json()\n\n\n@app.post(\"/v1/chat/completions\")\nasync def chat_completions(\n request: ChatCompletionRequest,\n authorization: str = Header(...),\n):\n verify_api_key(authorization)\n\n if not request.messages:\n raise HTTPException(status_code=400, detail=\"No messages provided\")\n\n async with httpx.AsyncClient() as client:\n if request.stream:\n async def stream_with_cleanup():\n async with httpx.AsyncClient() as stream_client:\n async with stream_client.stream(\n \"POST\",\n f\"{DS2API_URL}/v1/chat/completions\",\n json=request.model_dump(),\n headers={\"Authorization\": \"Bearer sk-test123456\"},\n timeout=120,\n ) as resp:\n async for line in resp.aiter_lines():\n yield line + \"\\n\"\n\n return StreamingResponse(\n stream_with_cleanup(),\n media_type=\"text/event-stream\",\n )\n\n resp = await client.post(\n f\"{DS2API_URL}/v1/chat/completions\",\n json=request.model_dump(),\n headers={\"Authorization\": \"Bearer sk-test123456\"},\n timeout=120,\n )\n return resp.json()\n\n\n@app.get(\"/anthropic/v1/models\")\nasync def anthropic_models(authorization: str = Header(...)):\n verify_api_key(authorization)\n\n return {\n \"data\": [\n {\"id\": \"claude-sonnet-4-6\", \"object\": \"model\", \"created\": int(time.time()), \"owned_by\": \"anthropic\"},\n {\"id\": \"claude-opus-4-6\", \"object\": \"model\", \"created\": int(time.time()), \"owned_by\": \"anthropic\"},\n {\"id\": \"claude-haiku-4-5\", \"object\": \"model\", \"created\": int(time.time()), \"owned_by\": \"anthropic\"},\n ],\n \"object\": \"list\",\n }\n\n\n@app.post(\"/anthropic/v1/messages\")\nasync def anthropic_messages(request: Request, authorization: str = Header(...)):\n verify_api_key(authorization)\n\n body = await request.json()\n messages = body.get(\"messages\", [])\n model = body.get(\"model\", \"claude-sonnet-4-6\")\n stream = body.get(\"stream\", False)\n\n if not messages:\n raise HTTPException(status_code=400, detail=\"No messages provided\")\n\n prompt = messages[-1].get(\"content\", \"\")\n\n async with httpx.AsyncClient() as client:\n if stream:\n async def stream_with_cleanup():\n async with httpx.AsyncClient() as stream_client:\n async with stream_client.stream(\n \"POST\",\n f\"{DS2API_URL}/v1/chat/completions\",\n json={\"model\": \"deepseek-v4-flash\", \"messages\": [{\"role\": \"user\", \"content\": prompt}], \"stream\": True},\n headers={\"Authorization\": \"Bearer sk-test123456\"},\n timeout=120,\n ) as resp:\n async for line in resp.aiter_lines():\n if line.startswith(\"data: \"):\n data_str = line[6:].strip()\n if data_str == \"[DONE]\":\n continue\n try:\n data = json.loads(data_str)\n content = data.get(\"choices\", [{}])[0].get(\"delta\", {}).get(\"content\", \"\")\n if content:\n yield f\"event: content_block_delta\\ndata: {json.dumps({'type': 'content_block_delta', 'index': 0, 'delta': {'type': 'text_delta', 'text': content}})}\\n\\n\"\n except json.JSONDecodeError:\n pass\n \n yield f\"event: message_stop\\ndata: {json.dumps({'type': 'message_stop'})}\\n\\n\"\n\n return StreamingResponse(\n stream_with_cleanup(),\n media_type=\"text/event-stream\",\n )\n\n resp = await client.post(\n f\"{DS2API_URL}/v1/chat/completions\",\n json={\"model\": \"deepseek-v4-flash\", \"messages\": [{\"role\": \"user\", \"content\": prompt}], \"stream\": False},\n headers={\"Authorization\": \"Bearer sk-test123456\"},\n timeout=120,\n )\n data = resp.json()\n content = data.get(\"choices\", [{}])[0].get(\"message\", {}).get(\"content\", \"\")\n\n return {\n \"id\": f\"msg_{uuid.uuid4().hex[:8]}\",\n \"type\": \"message\",\n \"role\": \"assistant\",\n \"model\": model,\n \"content\": [{\"type\": \"text\", \"text\": content}],\n \"stop_reason\": \"end_turn\",\n \"usage\": {\n \"input_tokens\": len(prompt.split()),\n \"output_tokens\": len(content.split()),\n },\n }\n\n\n@app.post(\"/v1beta/models/{model}:generateContent\")\nasync def gemini_generate(model: str, request: Request, authorization: str = Header(...)):\n verify_api_key(authorization)\n\n body = await request.json()\n contents = body.get(\"contents\", [])\n\n if not contents:\n raise HTTPException(status_code=400, detail=\"No contents provided\")\n\n prompt = contents[-1].get(\"parts\", [{}])[0].get(\"text\", \"\")\n\n async with httpx.AsyncClient() as client:\n resp = await client.post(\n f\"{DS2API_URL}/v1/chat/completions\",\n json={\"model\": \"deepseek-v4-flash\", \"messages\": [{\"role\": \"user\", \"content\": prompt}], \"stream\": False},\n headers={\"Authorization\": \"Bearer sk-test123456\"},\n timeout=120,\n )\n data = resp.json()\n content = data.get(\"choices\", [{}])[0].get(\"message\", {}).get(\"content\", \"\")\n\n return {\n \"candidates\": [\n {\n \"content\": {\n \"parts\": [{\"text\": content}],\n \"role\": \"model\",\n },\n \"finishReason\": \"STOP\",\n }\n ],\n \"usageMetadata\": {\n \"promptTokenCount\": len(prompt.split()),\n \"candidatesTokenCount\": len(content.split()),\n \"totalTokenCount\": len(prompt.split()) + len(content.split()),\n },\n }\n\n\n@app.post(\"/v1beta/models/{model}:streamGenerateContent\")\nasync def gemini_stream_generate(model: str, request: Request, authorization: str = Header(...)):\n verify_api_key(authorization)\n\n body = await request.json()\n contents = body.get(\"contents\", [])\n\n if not contents:\n raise HTTPException(status_code=400, detail=\"No contents provided\")\n\n prompt = contents[-1].get(\"parts\", [{}])[0].get(\"text\", \"\")\n\n async def stream_with_cleanup():\n async with httpx.AsyncClient() as stream_client:\n async with stream_client.stream(\n \"POST\",\n f\"{DS2API_URL}/v1/chat/completions\",\n json={\"model\": \"deepseek-v4-flash\", \"messages\": [{\"role\": \"user\", \"content\": prompt}], \"stream\": True},\n headers={\"Authorization\": \"Bearer sk-test123456\"},\n timeout=120,\n ) as resp:\n async for line in resp.aiter_lines():\n if line.startswith(\"data: \"):\n data_str = line[6:].strip()\n if data_str == \"[DONE]\":\n continue\n try:\n data = json.loads(data_str)\n content = data.get(\"choices\", [{}])[0].get(\"delta\", {}).get(\"content\", \"\")\n if content:\n yield f\"data: {json.dumps({'candidates': [{'content': {'parts': [{'text': content}], 'role': 'model'}}]})}\\n\\n\"\n except json.JSONDecodeError:\n pass\n \n yield f\"data: {json.dumps({'candidates': [{'content': {'parts': [], 'role': 'model'}, 'finishReason': 'STOP'}], 'usageMetadata': {'promptTokenCount': 0, 'candidatesTokenCount': 0, 'totalTokenCount': 0}})}\\n\\n\"\n\n return StreamingResponse(\n stream_with_cleanup(),\n media_type=\"text/event-stream\",\n )\n\n\n@app.get(\"/api/version\")\nasync def ollama_version():\n return {\"version\": \"0.1.0\"}\n\n\n@app.get(\"/api/tags\")\nasync def ollama_tags():\n return {\n \"models\": [\n {\"name\": \"deepseek-chat\", \"model\": \"deepseek-chat\"},\n {\"name\": \"deepseek-reasoner\", \"model\": \"deepseek-reasoner\"},\n ]\n }\n\n\n@app.post(\"/api/show\")\nasync def ollama_show(request: Request):\n body = await request.json()\n model = body.get(\"model\", \"deepseek-chat\")\n\n return {\n \"id\": model,\n \"capabilities\": [\"tools\", \"thinking\"],\n }\n\n\n@app.get(\"/healthz\")\nasync def healthz():\n return {\"status\": \"ok\"}\n\n\n@app.get(\"/readyz\")\nasync def readyz():\n return {\"status\": \"ok\", \"accounts\": {\"total\": 1, \"in_use\": 0, \"available\": 1}}\n\n\n@app.get(\"/admin/stats\")\nasync def admin_stats(admin_key: str = Header(...)):\n if admin_key != ADMIN_KEY:\n raise HTTPException(status_code=401, detail=\"Invalid admin key\")\n\n return {\"total\": 1, \"in_use\": 0, \"available\": 1, \"logged_in\": 1, \"queue_size\": 0}\n\n\n@app.get(\"/admin/config\")\nasync def get_config(admin_key: str = Header(...)):\n if admin_key != ADMIN_KEY:\n raise HTTPException(status_code=401, detail=\"Invalid admin key\")\n\n return {\n \"server\": {\"host\": \"0.0.0.0\", \"port\": 5002},\n \"browser\": {\"headless\": True, \"max_concurrent_per_account\": 1, \"timeout\": 60000},\n \"default_proxy\": None,\n \"account_count\": 1,\n }\n\n\ndef main():\n import uvicorn\n\n uvicorn.run(\n app,\n host=\"0.0.0.0\",\n port=5002,\n )\n\n\nif __name__ == \"__main__\":\n main()\n"}}}}