Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/booniex_openrouter-proxy.json
T

1 line
12 KiB
JSON

{"repo": "booniex/openrouter-proxy", "files": {"docs/CLIENT.md": {"117d9e24d7d8781b81373aa31eaea07d29170e4d": {"t": 1785746542.7999992, "n": 5569, "h": "2cae2c40bf1fda65", "c": "# Client API Documentation\n\n[← Back to README](../README.md)\n\n## Base URL\n\n```\nhttps://api.yourdomain.com/v1\n```\n\n## Authentication\n\nAll requests require `Authorization` header:\n\n```\nAuthorization: Bearer sk-YOUR_API_KEY\n```\n\nYour API key is provided when you register. Keep it secret.\n\n---\n\n## Chat Completions\n\n### Endpoint\n\n```\nPOST /v1/chat/completions\n```\n\n### Request Body\n\n```json\n{\n \"model\": \"openai/gpt-4o-mini\",\n \"messages\": [\n {\"role\": \"user\", \"content\": \"Hello\"}\n ],\n \"stream\": false,\n \"temperature\": 0.7,\n \"max_tokens\": 1000\n}\n```\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `model` | string | Yes | Model ID from OpenRouter (see available models below) |\n| `messages` | array | Yes | Array of message objects |\n| `stream` | boolean | No | Enable streaming responses (default: `false`) |\n| `temperature` | number | No | Sampling temperature 0-2 (default: `1`) |\n| `max_tokens` | integer | No | Maximum tokens to generate |\n\n### Message Format\n\n```json\n{\"role\": \"system\", \"content\": \"You are helpful.\"}\n{\"role\": \"user\", \"content\": \"What is 2+2?\"}\n{\"role\": \"assistant\", \"content\": \"4\"}\n```\n\nRoles: `system`, `user`, `assistant`\n\n### Non-Streaming Response\n\n```json\n{\n \"id\": \"gen-abc123\",\n \"model\": \"openai/gpt-4o-mini\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"Hello! How can I help you?\"\n },\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 10,\n \"completion_tokens\": 8,\n \"total_tokens\": 18\n }\n}\n```\n\n### Streaming Response\n\nSet `\"stream\": true`. Response is Server-Sent Events (SSE):\n\n```\ndata: {\"id\":\"gen-abc123\",\"model\":\"openai/gpt-4o-mini\",\"choices\":[{\"index\":0,\"delta\":{\"role\":\"assistant\",\"content\":\"Hello\"},\"finish_reason\":null}]}\n\ndata: {\"id\":\"gen-abc123\",\"model\":\"openai/gpt-4o-mini\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"!\"},\"finish_reason\":null}]}\n\ndata: {\"id\":\"gen-abc123\",\"model\":\"openai/gpt-4o-mini\",\"choices\":[{\"index\":0,\"delta\":{},\"finish_reason\":\"stop\"}]}\n\ndata: [DONE]\n```\n\n### Streaming Usage Stats\n\nUsage information sent in final chunk before `[DONE]`. Some models include `usage` field in the last chunk.\n\n---\n\n## Available Models\n\n| Model | ID |\n|-------|----|\n| GPT-4o | `openai/gpt-4o` |\n| GPT-4o Mini | `openai/gpt-4o-mini` |\n| Claude 3.5 Sonnet | `anthropic/claude-3.5-sonnet` |\n| Claude 3 Haiku | `anthropic/claude-3-haiku` |\n| Llama 3 8B | `meta-llama/llama-3-8b-instruct:free` |\n| Llama 3 70B | `meta-llama/llama-3-70b-instruct:free` |\n| Gemini Pro 1.5 | `google/gemini-pro-1.5` |\n| DeepSeek Chat | `deepseek/deepseek-chat` |\n\nFull list: https://openrouter.ai/models\n\n---\n\n## Errors\n\n| Status | Meaning | Cause |\n|--------|---------|-------|\n| `401` | Unauthorized | Invalid or missing API key |\n| `402` | Payment Required | Insufficient balance |\n| `403` | Forbidden | Account suspended |\n| `429` | Too Many Requests | Rate limit exceeded (60 RPM) |\n| `500` | Server Error | Proxy or upstream error |\n\nError response format:\n\n```json\n{\n \"error\": \"Error message here\"\n}\n```\n\n---\n\n## Rate Limits\n\n- **60 requests per minute** per API key\n- Headers included in response:\n - `X-RateLimit-Limit`: Maximum requests per window\n - `X-RateLimit-Remaining`: Remaining requests\n - `X-RateLimit-Reset`: Window reset time\n\n---\n\n## Usage Examples\n\n### cURL\n\n```bash\n# Non-streaming\ncurl -X POST https://api.yourdomain.com/v1/chat/completions \\\n -H \"Authorization: Bearer sk-YOUR_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"model\": \"openai/gpt-4o-mini\",\n \"messages\": [{\"role\": \"user\", \"content\": \"Say hello\"}]\n }'\n\n# Streaming\ncurl -X POST https://api.yourdomain.com/v1/chat/completions \\\n -H \"Authorization: Bearer sk-YOUR_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"model\": \"openai/gpt-4o-mini\",\n \"messages\": [{\"role\": \"user\", \"content\": \"Say hello\"}],\n \"stream\": true\n }'\n```\n\n### Python (OpenAI SDK)\n\n```python\nfrom openai import OpenAI\n\nclient = OpenAI(\n api_key=\"sk-YOUR_API_KEY\",\n base_url=\"https://api.yourdomain.com/v1\"\n)\n\n# Non-streaming\nresponse = client.chat.completions.create(\n model=\"openai/gpt-4o-mini\",\n messages=[{\"role\": \"user\", \"content\": \"Hello\"}]\n)\nprint(response.choices[0].message.content)\n\n# Streaming\nstream = client.chat.completions.create(\n model=\"openai/gpt-4o-mini\",\n messages=[{\"role\": \"user\", \"content\": \"Hello\"}],\n stream=True\n)\nfor chunk in stream:\n if chunk.choices[0].delta.content:\n print(chunk.choices[0].delta.content, end=\"\")\n```\n\n### JavaScript (OpenAI SDK)\n\n```javascript\nimport OpenAI from 'openai';\n\nconst client = new OpenAI({\n apiKey: 'sk-YOUR_API_KEY',\n baseURL: 'https://api.yourdomain.com/v1'\n});\n\n// Non-streaming\nconst response = await client.chat.completions.create({\n model: 'openai/gpt-4o-mini',\n messages: [{ role: 'user', content: 'Hello' }]\n});\nconsole.log(response.choices[0].message.content);\n\n// Streaming\nconst stream = await client.chat.completions.create({\n model: 'openai/gpt-4o-mini',\n messages: [{ role: 'user', content: 'Hello' }],\n stream: true\n});\nfor await (const chunk of stream) {\n process.stdout.write(chunk.choices[0]?.delta?.content || '');\n}\n```\n\n### OpenCode Config\n\n```json\n{\n \"provider\": \"openrouter\",\n \"model\": \"openai/gpt-4o-mini\",\n \"apiKey\": \"sk-YOUR_API_KEY\",\n \"baseUrl\": \"https://api.yourdomain.com/v1\"\n}\n```\n\n---\n\n## Check Balance\n\nContact admin to check your remaining balance.\n\n---\n\n## Support\n\nContact your API provider for:\n- Balance inquiries\n- API key issues\n- Model availability questions\n"}, "0d1aa501d904e9cc7bdd16c263063b7b6d461f8b": {"t": 1785765481.1392329, "n": 5569, "h": "2cae2c40bf1fda65", "c": "# Client API Documentation\n\n[← Back to README](../README.md)\n\n## Base URL\n\n```\nhttps://api.yourdomain.com/v1\n```\n\n## Authentication\n\nAll requests require `Authorization` header:\n\n```\nAuthorization: Bearer sk-YOUR_API_KEY\n```\n\nYour API key is provided when you register. Keep it secret.\n\n---\n\n## Chat Completions\n\n### Endpoint\n\n```\nPOST /v1/chat/completions\n```\n\n### Request Body\n\n```json\n{\n \"model\": \"openai/gpt-4o-mini\",\n \"messages\": [\n {\"role\": \"user\", \"content\": \"Hello\"}\n ],\n \"stream\": false,\n \"temperature\": 0.7,\n \"max_tokens\": 1000\n}\n```\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `model` | string | Yes | Model ID from OpenRouter (see available models below) |\n| `messages` | array | Yes | Array of message objects |\n| `stream` | boolean | No | Enable streaming responses (default: `false`) |\n| `temperature` | number | No | Sampling temperature 0-2 (default: `1`) |\n| `max_tokens` | integer | No | Maximum tokens to generate |\n\n### Message Format\n\n```json\n{\"role\": \"system\", \"content\": \"You are helpful.\"}\n{\"role\": \"user\", \"content\": \"What is 2+2?\"}\n{\"role\": \"assistant\", \"content\": \"4\"}\n```\n\nRoles: `system`, `user`, `assistant`\n\n### Non-Streaming Response\n\n```json\n{\n \"id\": \"gen-abc123\",\n \"model\": \"openai/gpt-4o-mini\",\n \"choices\": [\n {\n \"index\": 0,\n \"message\": {\n \"role\": \"assistant\",\n \"content\": \"Hello! How can I help you?\"\n },\n \"finish_reason\": \"stop\"\n }\n ],\n \"usage\": {\n \"prompt_tokens\": 10,\n \"completion_tokens\": 8,\n \"total_tokens\": 18\n }\n}\n```\n\n### Streaming Response\n\nSet `\"stream\": true`. Response is Server-Sent Events (SSE):\n\n```\ndata: {\"id\":\"gen-abc123\",\"model\":\"openai/gpt-4o-mini\",\"choices\":[{\"index\":0,\"delta\":{\"role\":\"assistant\",\"content\":\"Hello\"},\"finish_reason\":null}]}\n\ndata: {\"id\":\"gen-abc123\",\"model\":\"openai/gpt-4o-mini\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"!\"},\"finish_reason\":null}]}\n\ndata: {\"id\":\"gen-abc123\",\"model\":\"openai/gpt-4o-mini\",\"choices\":[{\"index\":0,\"delta\":{},\"finish_reason\":\"stop\"}]}\n\ndata: [DONE]\n```\n\n### Streaming Usage Stats\n\nUsage information sent in final chunk before `[DONE]`. Some models include `usage` field in the last chunk.\n\n---\n\n## Available Models\n\n| Model | ID |\n|-------|----|\n| GPT-4o | `openai/gpt-4o` |\n| GPT-4o Mini | `openai/gpt-4o-mini` |\n| Claude 3.5 Sonnet | `anthropic/claude-3.5-sonnet` |\n| Claude 3 Haiku | `anthropic/claude-3-haiku` |\n| Llama 3 8B | `meta-llama/llama-3-8b-instruct:free` |\n| Llama 3 70B | `meta-llama/llama-3-70b-instruct:free` |\n| Gemini Pro 1.5 | `google/gemini-pro-1.5` |\n| DeepSeek Chat | `deepseek/deepseek-chat` |\n\nFull list: https://openrouter.ai/models\n\n---\n\n## Errors\n\n| Status | Meaning | Cause |\n|--------|---------|-------|\n| `401` | Unauthorized | Invalid or missing API key |\n| `402` | Payment Required | Insufficient balance |\n| `403` | Forbidden | Account suspended |\n| `429` | Too Many Requests | Rate limit exceeded (60 RPM) |\n| `500` | Server Error | Proxy or upstream error |\n\nError response format:\n\n```json\n{\n \"error\": \"Error message here\"\n}\n```\n\n---\n\n## Rate Limits\n\n- **60 requests per minute** per API key\n- Headers included in response:\n - `X-RateLimit-Limit`: Maximum requests per window\n - `X-RateLimit-Remaining`: Remaining requests\n - `X-RateLimit-Reset`: Window reset time\n\n---\n\n## Usage Examples\n\n### cURL\n\n```bash\n# Non-streaming\ncurl -X POST https://api.yourdomain.com/v1/chat/completions \\\n -H \"Authorization: Bearer sk-YOUR_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"model\": \"openai/gpt-4o-mini\",\n \"messages\": [{\"role\": \"user\", \"content\": \"Say hello\"}]\n }'\n\n# Streaming\ncurl -X POST https://api.yourdomain.com/v1/chat/completions \\\n -H \"Authorization: Bearer sk-YOUR_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"model\": \"openai/gpt-4o-mini\",\n \"messages\": [{\"role\": \"user\", \"content\": \"Say hello\"}],\n \"stream\": true\n }'\n```\n\n### Python (OpenAI SDK)\n\n```python\nfrom openai import OpenAI\n\nclient = OpenAI(\n api_key=\"sk-YOUR_API_KEY\",\n base_url=\"https://api.yourdomain.com/v1\"\n)\n\n# Non-streaming\nresponse = client.chat.completions.create(\n model=\"openai/gpt-4o-mini\",\n messages=[{\"role\": \"user\", \"content\": \"Hello\"}]\n)\nprint(response.choices[0].message.content)\n\n# Streaming\nstream = client.chat.completions.create(\n model=\"openai/gpt-4o-mini\",\n messages=[{\"role\": \"user\", \"content\": \"Hello\"}],\n stream=True\n)\nfor chunk in stream:\n if chunk.choices[0].delta.content:\n print(chunk.choices[0].delta.content, end=\"\")\n```\n\n### JavaScript (OpenAI SDK)\n\n```javascript\nimport OpenAI from 'openai';\n\nconst client = new OpenAI({\n apiKey: 'sk-YOUR_API_KEY',\n baseURL: 'https://api.yourdomain.com/v1'\n});\n\n// Non-streaming\nconst response = await client.chat.completions.create({\n model: 'openai/gpt-4o-mini',\n messages: [{ role: 'user', content: 'Hello' }]\n});\nconsole.log(response.choices[0].message.content);\n\n// Streaming\nconst stream = await client.chat.completions.create({\n model: 'openai/gpt-4o-mini',\n messages: [{ role: 'user', content: 'Hello' }],\n stream: true\n});\nfor await (const chunk of stream) {\n process.stdout.write(chunk.choices[0]?.delta?.content || '');\n}\n```\n\n### OpenCode Config\n\n```json\n{\n \"provider\": \"openrouter\",\n \"model\": \"openai/gpt-4o-mini\",\n \"apiKey\": \"sk-YOUR_API_KEY\",\n \"baseUrl\": \"https://api.yourdomain.com/v1\"\n}\n```\n\n---\n\n## Check Balance\n\nContact admin to check your remaining balance.\n\n---\n\n## Support\n\nContact your API provider for:\n- Balance inquiries\n- API key issues\n- Model availability questions\n"}}}}