{"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"}}}}