Local branch had diverged from origin/master (sibling commits on the same base). Rewrote local history linearly on top of origin/master, folding in all local content: exa/hot-platform discovery hunters, leaks ledger, nightly sweep orchestrator, updated .gitignore and skill docs, plus the latest hunt output and vault state. Remote-only files (vault keys, channel scripts) were restored rather than dropped, so the resulting tree is a full union of both sides.
1 line
18 KiB
JSON
1 line
18 KiB
JSON
{"repo": "9router/9router.github.io", "files": {"es/integration/other-tools/__next._full.txt": {"2a226827eee949a30c9eb3162ecef6433e6d4874": {"t": 1786068466.2539847, "n": 16895, "h": "ab38d538f4a81cda", "c": "1:\"$Sreact.fragment\"\n2:I[39756,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/803a574de9eda7ae.js\"],\"default\"]\n3:I[37457,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/803a574de9eda7ae.js\"],\"default\"]\n5:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/803a574de9eda7ae.js\"],\"OutletBoundary\"]\n6:\"$Sreact.suspense\"\n8:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/803a574de9eda7ae.js\"],\"ViewportBoundary\"]\na:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/803a574de9eda7ae.js\"],\"MetadataBoundary\"]\nc:I[68027,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/803a574de9eda7ae.js\"],\"default\"]\n:HL[\"/_next/static/chunks/3036d048e811dd2e.css\",\"style\"]\n0:{\"P\":null,\"b\":\"Hm4JVZQfdknM-xL-chWUw\",\"c\":[\"\",\"es\",\"integration\",\"other-tools\",\"\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[[\"lang\",\"es\",\"d\"],{\"children\":[[\"slug\",\"integration/other-tools\",\"c\"],{\"children\":[\"__PAGE__\",{}]}]}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/3036d048e811dd2e.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"link\",null,{\"rel\":\"preconnect\",\"href\":\"https://fonts.googleapis.com\"}],[\"$\",\"link\",null,{\"rel\":\"preconnect\",\"href\":\"https://fonts.gstatic.com\",\"crossOrigin\":\"anonymous\"}]]}],[\"$\",\"body\",null,{\"className\":\"bg-[#FCFBF9] text-[#6B7280]\",\"children\":[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[\"$L4\",[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/ff1a16fafef87110.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/38d0ea078f2914f2.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L5\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@7\"}]}]]}],{},null,false,false]},null,false,false]},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true}\nd:I[81956,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/38d0ea078f2914f2.js\"],\"default\"]\ne:I[22982,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/38d0ea078f2914f2.js\"],\"default\"]\nf:T258f,# Integración con otras herramientas\n\n9Router es compatible con cualquier herramienta que soporte el formato de API de OpenAI. Esta guía cubre patrones de integración genéricos para varias herramientas y aplicaciones personalizadas.\n\n## Resumen\n\n9Router proporciona un endpoint de API compatible con OpenAI que funciona con:\n- Scripts y aplicaciones personalizadas\n- Clientes de API y herramientas de testing\n- Herramientas CLI y utilidades\n- Integraciones de terceros\n- Frameworks de desarrollo\n\n## Patrón de configuración genérico\n\nCualquier herramienta compatible con OpenAI puede conectarse a 9Router usando estas configuraciones:\n\n**9Router local:**\n```\nBase URL: http://localhost:20128/v1\nAPI Key: your-api-key-from-dashboard\nModel: cualquier modelo de 9Router (cc/*, cx/*, glm/*, etc.)\n```\n\n**9Router en la nube:**\n```\nBase URL: https://9router.com/v1\nAPI Key: your-api-key-from-dashboard\nModel: cualquier modelo de 9Router (cc/*, cx/*, glm/*, etc.)\n```\n\n## Modelos disponibles\n\n### Modelos Claude (Anthropic)\n- `cc/claude-opus-4-5-20251101`\n- `cc/claude-sonnet-4-20250514`\n- `cc/claude-haiku-4-20250514`\n\n### Modelos DeepSeek\n- `cx/deepseek-chat`\n- `cx/deepseek-reasoner`\n\n### Modelos GLM (Zhipu AI)\n- `glm/glm-4-plus`\n- `glm/glm-4-flash`\n\n## Ejemplos de integración\n\n### Python con OpenAI SDK\n\n```python\nfrom openai import OpenAI\n\nclient = OpenAI(\n api_key=\"your-api-key-from-dashboard\",\n base_url=\"http://localhost:20128/v1\"\n)\n\nresponse = client.chat.completions.create(\n model=\"cc/claude-sonnet-4-20250514\",\n messages=[\n {\"role\": \"user\", \"content\": \"Hello, how are you?\"}\n ]\n)\n\nprint(response.choices[0].message.content)\n```\n\n### Node.js con OpenAI SDK\n\n```javascript\nimport OpenAI from \"openai\";\n\nconst client = new OpenAI({\n apiKey: \"your-api-key-from-dashboard\",\n baseURL: \"http://localhost:20128/v1\"\n});\n\nconst response = await client.chat.completions.create({\n model: \"cc/claude-sonnet-4-20250514\",\n messages: [\n { role: \"user\", content: \"Hello, how are you?\" }\n ]\n});\n\nconsole.log(response.choices[0].message.content);\n```\n\n### Comando cURL\n\n```bash\ncurl http://localhost:20128/v1/chat/completions \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer your-api-key-from-dashboard\" \\\n -d '{\n \"model\": \"cc/claude-sonnet-4-20250514\",\n \"messages\": [\n {\"role\": \"user\", \"content\": \"Hello, how are you?\"}\n ]\n }'\n```\n\n### Cliente HTTP (Postman, Insomnia)\n\n**Solicitud:**\n```\nPOST http://localhost:20128/v1/chat/completions\n```\n\n**Headers:**\n```\nContent-Type: application/json\nAuthorization: Bearer your-api-key-from-dashboard\n```\n\n**Body:**\n```json\n{\n \"model\": \"cc/claude-sonnet-4-20250514\",\n \"messages\": [\n {\"role\": \"user\", \"content\": \"Hello, how are you?\"}\n ],\n \"temperature\": 0.7,\n \"max_tokens\": 1000\n}\n```\n\n### Integración con LangChain\n\n```python\nfrom langchain.chat_models import ChatOpenAI\nfrom langchain.schema import HumanMessage\n\nllm = ChatOpenAI(\n model_name=\"cc/claude-sonnet-4-20250514\",\n openai_api_key=\"your-api-key-from-dashboard\",\n openai_api_base=\"http://localhost:20128/v1\",\n temperature=0.7\n)\n\nmessages = [HumanMessage(content=\"Explain quantum computing\")]\nresponse = llm(messages)\nprint(response.content)\n```\n\n### Integración con LlamaIndex\n\n```python\nfrom llama_index.llms import OpenAI\n\nllm = OpenAI(\n model=\"cc/claude-sonnet-4-20250514\",\n api_key=\"your-api-key-from-dashboard\",\n api_base=\"http://localhost:20128/v1\"\n)\n\nresponse = llm.complete(\"What is machine learning?\")\nprint(response.text)\n```\n\n## Ejemplos de scripts personalizados\n\n### Script de procesamiento por lotes\n\n```python\nimport openai\nimport json\n\nopenai.api_key = \"your-api-key-from-dashboard\"\nopenai.api_base = \"http://localhost:20128/v1\"\n\ndef process_batch(prompts, model=\"cx/deepseek-chat\"):\n results = []\n for prompt in prompts:\n response = openai.ChatCompletion.create(\n model=model,\n messages=[{\"role\": \"user\", \"content\": prompt}]\n )\n results.append({\n \"prompt\": prompt,\n \"response\": response.choices[0].message.content\n })\n return results\n\nprompts = [\n \"Explain AI in one sentence\",\n \"What is machine learning?\",\n \"Define neural networks\"\n]\n\nresults = process_batch(prompts)\nprint(json.dumps(results, indent=2))\n```\n\n### Manejador de respuestas streaming\n\n```javascript\nimport OpenAI from \"openai\";\n\nconst client = new OpenAI({\n apiKey: \"your-api-key-from-dashboard\",\n baseURL: \"http://localhost:20128/v1\"\n});\n\nasync function streamResponse(prompt) {\n const stream = await client.chat.completions.create({\n model: \"cc/claude-sonnet-4-20250514\",\n messages: [{ role: \"user\", content: prompt }],\n stream: true\n });\n\n for await (const chunk of stream) {\n const content = chunk.choices[0]?.delta?.content || \"\";\n process.stdout.write(content);\n }\n}\n\nstreamResponse(\"Write a short story about AI\");\n```\n\n### Comparación multi-modelo\n\n```python\nfrom openai import OpenAI\n\nclient = OpenAI(\n api_key=\"your-api-key-from-dashboard\",\n base_url=\"http://localhost:20128/v1\"\n)\n\nmodels = [\n \"cc/claude-sonnet-4-20250514\",\n \"cx/deepseek-chat\",\n \"glm/glm-4-plus\"\n]\n\nprompt = \"Explain quantum computing in simple terms\"\n\nfor model in models:\n response = client.chat.completions.create(\n model=model,\n messages=[{\"role\": \"user\", \"content\": prompt}]\n )\n print(f\"\\n=== {model} ===\")\n print(response.choices[0].message.content)\n```\n\n## Patrones comunes de integración\n\n### Variables de entorno\n\nAlmacena credenciales de forma segura:\n\n```bash\n# .env file\nROUTER_API_KEY=your-api-key-from-dashboard\nROUTER_BASE_URL=http://localhost:20128/v1\nROUTER_MODEL=cc/claude-sonnet-4-20250514\n```\n\n```python\nimport os\nfrom openai import OpenAI\n\nclient = OpenAI(\n api_key=os.getenv(\"ROUTER_API_KEY\"),\n base_url=os.getenv(\"ROUTER_BASE_URL\")\n)\n```\n\n### Manejo de errores\n\n```python\nfrom openai import OpenAI, OpenAIError\n\nclient = OpenAI(\n api_key=\"your-api-key\",\n base_url=\"http://localhost:20128/v1\"\n)\n\ntry:\n response = client.chat.completions.create(\n model=\"cc/claude-sonnet-4-20250514\",\n messages=[{\"role\": \"user\", \"content\": \"Hello\"}]\n )\n print(response.choices[0].message.content)\nexcept OpenAIError as e:\n print(f\"Error: {e}\")\n```\n\n### Lógica de reintentos\n\n```python\nimport time\nfrom openai import OpenAI, RateLimitError\n\nclient = OpenAI(\n api_key=\"your-api-key\",\n base_url=\"http://localhost:20128/v1\"\n)\n\ndef chat_with_retry(prompt, max_retries=3):\n for attempt in range(max_retries):\n try:\n response = client.chat.completions.create(\n model=\"cc/claude-sonnet-4-20250514\",\n messages=[{\"role\": \"user\", \"content\": prompt}]\n )\n return response.choices[0].message.content\n except RateLimitError:\n if attempt < max_retries - 1:\n time.sleep(2 ** attempt) # Exponential backoff\n else:\n raise\n```\n\n## Solución de problemas\n\n### Problemas de conexión\n\n**Problema:** No se puede conectar a 9Router\n```bash\n# Verifica si 9Router está corriendo\ncurl http://localhost:20128/health\n\n# Respuesta esperada:\n{\"status\": \"ok\"}\n```\n\n**Solución:**\n- Verifica que 9Router esté corriendo\n- Verifica que el puerto 20128 no esté bloqueado\n- Asegúrate de tener la URL base correcta (incluir `/v1`)\n\n### Errores de autenticación\n\n**Problema:** 401 Unauthorized\n```\nError: Invalid API key\n```\n\n**Solución:**\n- Verifica la API key desde el dashboard\n- Verifica el formato del header de Authorization: `Bearer your-api-key`\n- Asegúrate de no tener espacios extras o saltos de línea en la API key\n\n### Modelo no encontrado\n\n**Problema:** 404 Model not found\n```\nError: Model 'cc/claude-opus' not found\n```\n\n**Solución:**\n- Usa el nombre exacto del modelo (sensible a mayúsculas)\n- Verifica los modelos disponibles: `curl http://localhost:20128/v1/models`\n- Verifica que el modelo esté habilitado en tu plan\n\n### Problemas de timeout\n\n**Problema:** Request timeout\n```\nError: Request timed out after 30s\n```\n\n**Solución:**\n- Aumenta el timeout en la configuración del cliente\n- Usa modelos más rápidos para tareas sensibles al tiempo\n- Verifica la conexión de red a 9Router\n\n### Rate limiting\n\n**Problema:** 429 Too Many Requests\n```\nError: Rate limit exceeded\n```\n\n**Solución:**\n- Implementa exponential backoff\n- Reduce la frecuencia de solicitudes\n- Verifica los límites de tasa en el dashboard\n- Considera actualizar tu plan\n\n## Mejores prácticas\n\n### Seguridad\n- Almacena las API keys en variables de entorno\n- Nunca subas las API keys al control de versiones\n- Usa HTTPS para despliegues en la nube\n- Rota las API keys regularmente\n\n### Rendimiento\n- Usa modelos apropiados para la complejidad de la tarea\n- Implementa caché para consultas repetidas\n- Usa streaming para respuestas largas\n- Agrupa solicitudes cuando sea posible\n\n### Manejo de errores\n- Siempre implementa bloques try-catch\n- Agrega lógica de reintento con exponential backoff\n- Registra errores para debugging\n- Proporciona mecanismos de fallback\n\n### Optimización de costos\n- Elige modelos costo-efectivos para tareas simples\n- Cachea respuestas cuando sea apropiado\n- Monitorea el uso en el dashboard\n- Establece límites de solicitudes en el código\n\n## Próximos pasos\n\n- [Configurar Cursor](cursor.md) para integración con IDE\n- [Configurar Continue](continue.md) para VSCode\n- [Explorar uso de CLI](../cli/basic-usage.md)\n- [Aprende sobre la selección de modelos](../models/overview.md)\n- [Referencia de API](../api/reference.md)\n4:[\"$\",\"$Ld\",null,{\"headings\":[{\"level\":2,\"text\":\"Resumen\",\"id\":\"resumen\"},{\"level\":2,\"text\":\"Patrón de configuración genérico\",\"id\":\"patrón-de-configuración-genérico\"},{\"level\":2,\"text\":\"Modelos disponibles\",\"id\":\"modelos-disponibles\"},{\"level\":3,\"text\":\"Modelos Claude (Anthropic)\",\"id\":\"modelos-claude-anthropic\"},{\"level\":3,\"text\":\"Modelos DeepSeek\",\"id\":\"modelos-deepseek\"},{\"level\":3,\"text\":\"Modelos GLM (Zhipu AI)\",\"id\":\"modelos-glm-zhipu-ai\"},{\"level\":2,\"text\":\"Ejemplos de integración\",\"id\":\"ejemplos-de-integración\"},{\"level\":3,\"text\":\"Python con OpenAI SDK\",\"id\":\"python-con-openai-sdk\"},{\"level\":3,\"text\":\"Node.js con OpenAI SDK\",\"id\":\"nodejs-con-openai-sdk\"},{\"level\":3,\"text\":\"Comando cURL\",\"id\":\"comando-curl\"},{\"level\":3,\"text\":\"Cliente HTTP (Postman, Insomnia)\",\"id\":\"cliente-http-postman-insomnia\"},{\"level\":3,\"text\":\"Integración con LangChain\",\"id\":\"integración-con-langchain\"},{\"level\":3,\"text\":\"Integración con LlamaIndex\",\"id\":\"integración-con-llamaindex\"},{\"level\":2,\"text\":\"Ejemplos de scripts personalizados\",\"id\":\"ejemplos-de-scripts-personalizados\"},{\"level\":3,\"text\":\"Script de procesamiento por lotes\",\"id\":\"script-de-procesamiento-por-lotes\"},{\"level\":3,\"text\":\"Manejador de respuestas streaming\",\"id\":\"manejador-de-respuestas-streaming\"},{\"level\":3,\"text\":\"Comparación multi-modelo\",\"id\":\"comparación-multi-modelo\"},{\"level\":2,\"text\":\"Patrones comunes de integración\",\"id\":\"patrones-comunes-de-integración\"},{\"level\":3,\"text\":\"Variables de entorno\",\"id\":\"variables-de-entorno\"},{\"level\":3,\"text\":\"Manejo de errores\",\"id\":\"manejo-de-errores\"},{\"level\":3,\"text\":\"Lógica de reintentos\",\"id\":\"lógica-de-reintentos\"},{\"level\":2,\"text\":\"Solución de problemas\",\"id\":\"solución-de-problemas\"},{\"level\":3,\"text\":\"Problemas de conexión\",\"id\":\"problemas-de-conexión\"},{\"level\":3,\"text\":\"Errores de autenticación\",\"id\":\"errores-de-autenticación\"},{\"level\":3,\"text\":\"Modelo no encontrado\",\"id\":\"modelo-no-encontrado\"},{\"level\":3,\"text\":\"Problemas de timeout\",\"id\":\"problemas-de-timeout\"},{\"level\":3,\"text\":\"Rate limiting\",\"id\":\"rate-limiting\"},{\"level\":2,\"text\":\"Mejores prácticas\",\"id\":\"mejores-prácticas\"},{\"level\":3,\"text\":\"Seguridad\",\"id\":\"seguridad\"},{\"level\":3,\"text\":\"Rendimiento\",\"id\":\"rendimiento\"},{\"level\":3,\"text\":\"Manejo de errores\",\"id\":\"manejo-de-errores\"},{\"level\":3,\"text\":\"Optimización de costos\",\"id\":\"optimización-de-costos\"},{\"level\":2,\"text\":\"Próximos pasos\",\"id\":\"próximos-pasos\"}],\"lang\":\"es\",\"children\":[\"$\",\"$Le\",null,{\"content\":\"$f\"}]}]\n9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n7:null\nb:[[\"$\",\"title\",\"0\",{\"children\":\"9Router Documentation\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Smart AI model router - Maximize subscriptions, minimize costs\"}]]\n"}}}} |