| # Other Tools Integration |
|
|
| 9Router is compatible with any tool that supports the OpenAI API format. This guide covers generic integration patterns for various tools and custom applications. |
|
|
| ## Overview |
|
|
| 9Router provides an OpenAI-compatible API endpoint that works with: |
| - Custom scripts and applications |
| - API clients and testing tools |
| - CLI tools and utilities |
| - Third-party integrations |
| - Development frameworks |
|
|
| ## Generic Setup Pattern |
|
|
| Any OpenAI-compatible tool can connect to 9Router using these settings: |
|
|
| **Local 9Router:** |
| ``` |
| Base URL: http://localhost:20128/v1 |
| API Key: your-api-key-from-dashboard |
| Model: any 9Router model (cc/*, cx/*, glm/*, etc.) |
| ``` |
|
|
| **Cloud 9Router:** |
| ``` |
| Base URL: https://9router.com/v1 |
| API Key: your-api-key-from-dashboard |
| Model: any 9Router model (cc/*, cx/*, glm/*, etc.) |
| ``` |
|
|
| ## Available Models |
|
|
| ### Claude Models (Anthropic) |
| - `cc/claude-opus-4-5-20251101` |
| - `cc/claude-sonnet-4-20250514` |
| - `cc/claude-haiku-4-20250514` |
|
|
| ### DeepSeek Models |
| - `cx/deepseek-chat` |
| - `cx/deepseek-reasoner` |
|
|
| ### GLM Models (Zhipu AI) |
| - `glm/glm-4-plus` |
| - `glm/glm-4-flash` |
|
|
| ## Integration Examples |
|
|
| ### Python with OpenAI SDK |
|
|
| ```python |
| from openai import OpenAI |
| |
| client = OpenAI( |
| api_key="your-api-key-from-dashboard", |
| base_url="http://localhost:20128/v1" |
| ) |
| |
| response = client.chat.completions.create( |
| model="cc/claude-sonnet-4-20250514", |
| messages=[ |
| {"role": "user", "content": "Hello, how are you?"} |
| ] |
| ) |
| |
| print(response.choices[0].message.content) |
| ``` |
|
|
| ### Node.js with OpenAI SDK |
|
|
| ```javascript |
| import OpenAI from "openai"; |
| |
| const client = new OpenAI({ |
| apiKey: "your-api-key-from-dashboard", |
| baseURL: "http://localhost:20128/v1" |
| }); |
| |
| const response = await client.chat.completions.create({ |
| model: "cc/claude-sonnet-4-20250514", |
| messages: [ |
| { role: "user", content: "Hello, how are you?" } |
| ] |
| }); |
| |
| console.log(response.choices[0].message.content); |
| ``` |
|
|
| ### cURL Command |
|
|
| ```bash |
| curl http://localhost:20128/v1/chat/completions \ |
| -H "Content-Type: application/json" \ |
| -H "Authorization: Bearer your-api-key-from-dashboard" \ |
| -d '{ |
| "model": "cc/claude-sonnet-4-20250514", |
| "messages": [ |
| {"role": "user", "content": "Hello, how are you?"} |
| ] |
| }' |
| ``` |
|
|
| ### HTTP Client (Postman, Insomnia) |
|
|
| **Request:** |
| ``` |
| POST http://localhost:20128/v1/chat/completions |
| ``` |
|
|
| **Headers:** |
| ``` |
| Content-Type: application/json |
| Authorization: Bearer your-api-key-from-dashboard |
| ``` |
|
|
| **Body:** |
| ```json |
| { |
| "model": "cc/claude-sonnet-4-20250514", |
| "messages": [ |
| {"role": "user", "content": "Hello, how are you?"} |
| ], |
| "temperature": 0.7, |
| "max_tokens": 1000 |
| } |
| ``` |
|
|
| ### LangChain Integration |
|
|
| ```python |
| from langchain.chat_models import ChatOpenAI |
| from langchain.schema import HumanMessage |
| |
| llm = ChatOpenAI( |
| model_name="cc/claude-sonnet-4-20250514", |
| openai_api_key="your-api-key-from-dashboard", |
| openai_api_base="http://localhost:20128/v1", |
| temperature=0.7 |
| ) |
| |
| messages = [HumanMessage(content="Explain quantum computing")] |
| response = llm(messages) |
| print(response.content) |
| ``` |
|
|
| ### LlamaIndex Integration |
|
|
| ```python |
| from llama_index.llms import OpenAI |
| |
| llm = OpenAI( |
| model="cc/claude-sonnet-4-20250514", |
| api_key="your-api-key-from-dashboard", |
| api_base="http://localhost:20128/v1" |
| ) |
| |
| response = llm.complete("What is machine learning?") |
| print(response.text) |
| ``` |
|
|
| ## Custom Script Examples |
|
|
| ### Batch Processing Script |
|
|
| ```python |
| import openai |
| import json |
| |
| openai.api_key = "your-api-key-from-dashboard" |
| openai.api_base = "http://localhost:20128/v1" |
| |
| def process_batch(prompts, model="cx/deepseek-chat"): |
| results = [] |
| for prompt in prompts: |
| response = openai.ChatCompletion.create( |
| model=model, |
| messages=[{"role": "user", "content": prompt}] |
| ) |
| results.append({ |
| "prompt": prompt, |
| "response": response.choices[0].message.content |
| }) |
| return results |
| |
| prompts = [ |
| "Explain AI in one sentence", |
| "What is machine learning?", |
| "Define neural networks" |
| ] |
| |
| results = process_batch(prompts) |
| print(json.dumps(results, indent=2)) |
| ``` |
|
|
| ### Streaming Response Handler |
|
|
| ```javascript |
| import OpenAI from "openai"; |
| |
| const client = new OpenAI({ |
| apiKey: "your-api-key-from-dashboard", |
| baseURL: "http://localhost:20128/v1" |
| }); |
| |
| async function streamResponse(prompt) { |
| const stream = await client.chat.completions.create({ |
| model: "cc/claude-sonnet-4-20250514", |
| messages: [{ role: "user", content: prompt }], |
| stream: true |
| }); |
| |
| for await (const chunk of stream) { |
| const content = chunk.choices[0]?.delta?.content || ""; |
| process.stdout.write(content); |
| } |
| } |
| |
| streamResponse("Write a short story about AI"); |
| ``` |
|
|
| ### Multi-Model Comparison |
|
|
| ```python |
| from openai import OpenAI |
| |
| client = OpenAI( |
| api_key="your-api-key-from-dashboard", |
| base_url="http://localhost:20128/v1" |
| ) |
| |
| models = [ |
| "cc/claude-sonnet-4-20250514", |
| "cx/deepseek-chat", |
| "glm/glm-4-plus" |
| ] |
| |
| prompt = "Explain quantum computing in simple terms" |
| |
| for model in models: |
| response = client.chat.completions.create( |
| model=model, |
| messages=[{"role": "user", "content": prompt}] |
| ) |
| print(f"\n=== {model} ===") |
| print(response.choices[0].message.content) |
| ``` |
|
|
| ## Common Integration Patterns |
|
|
| ### Environment Variables |
|
|
| Store credentials securely: |
|
|
| ```bash |
| # .env file |
| ROUTER_API_KEY=your-api-key-from-dashboard |
| ROUTER_BASE_URL=http://localhost:20128/v1 |
| ROUTER_MODEL=cc/claude-sonnet-4-20250514 |
| ``` |
|
|
| ```python |
| import os |
| from openai import OpenAI |
| |
| client = OpenAI( |
| api_key=os.getenv("ROUTER_API_KEY"), |
| base_url=os.getenv("ROUTER_BASE_URL") |
| ) |
| ``` |
|
|
| ### Error Handling |
|
|
| ```python |
| from openai import OpenAI, OpenAIError |
| |
| client = OpenAI( |
| api_key="your-api-key", |
| base_url="http://localhost:20128/v1" |
| ) |
| |
| try: |
| response = client.chat.completions.create( |
| model="cc/claude-sonnet-4-20250514", |
| messages=[{"role": "user", "content": "Hello"}] |
| ) |
| print(response.choices[0].message.content) |
| except OpenAIError as e: |
| print(f"Error: {e}") |
| ``` |
|
|
| ### Retry Logic |
|
|
| ```python |
| import time |
| from openai import OpenAI, RateLimitError |
| |
| client = OpenAI( |
| api_key="your-api-key", |
| base_url="http://localhost:20128/v1" |
| ) |
| |
| def chat_with_retry(prompt, max_retries=3): |
| for attempt in range(max_retries): |
| try: |
| response = client.chat.completions.create( |
| model="cc/claude-sonnet-4-20250514", |
| messages=[{"role": "user", "content": prompt}] |
| ) |
| return response.choices[0].message.content |
| except RateLimitError: |
| if attempt < max_retries - 1: |
| time.sleep(2 ** attempt) # Exponential backoff |
| else: |
| raise |
| ``` |
|
|
| ## Troubleshooting |
|
|
| ### Connection Issues |
|
|
| **Problem:** Cannot connect to 9Router |
| ```bash |
| # Check if 9Router is running |
| curl http://localhost:20128/health |
| |
| # Expected response: |
| {"status": "ok"} |
| ``` |
|
|
| **Solution:** |
| - Verify 9Router is running |
| - Check port 20128 is not blocked |
| - Ensure correct base URL (include `/v1`) |
|
|
| ### Authentication Errors |
|
|
| **Problem:** 401 Unauthorized |
| ``` |
| Error: Invalid API key |
| ``` |
|
|
| **Solution:** |
| - Verify API key from dashboard |
| - Check Authorization header format: `Bearer your-api-key` |
| - Ensure no extra spaces or newlines in API key |
|
|
| ### Model Not Found |
|
|
| **Problem:** 404 Model not found |
| ``` |
| Error: Model 'cc/claude-opus' not found |
| ``` |
|
|
| **Solution:** |
| - Use exact model name (case-sensitive) |
| - Check available models: `curl http://localhost:20128/v1/models` |
| - Verify model is enabled in your plan |
|
|
| ### Timeout Issues |
|
|
| **Problem:** Request timeout |
| ``` |
| Error: Request timed out after 30s |
| ``` |
|
|
| **Solution:** |
| - Increase timeout in client configuration |
| - Use faster models for time-sensitive tasks |
| - Check network connection to 9Router |
|
|
| ### Rate Limiting |
|
|
| **Problem:** 429 Too Many Requests |
| ``` |
| Error: Rate limit exceeded |
| ``` |
|
|
| **Solution:** |
| - Implement exponential backoff |
| - Reduce request frequency |
| - Check rate limits in dashboard |
| - Consider upgrading plan |
|
|
| ## Best Practices |
|
|
| ### Security |
| - Store API keys in environment variables |
| - Never commit API keys to version control |
| - Use HTTPS for cloud deployments |
| - Rotate API keys regularly |
|
|
| ### Performance |
| - Use appropriate models for task complexity |
| - Implement caching for repeated queries |
| - Use streaming for long responses |
| - Batch requests when possible |
|
|
| ### Error Handling |
| - Always implement try-catch blocks |
| - Add retry logic with exponential backoff |
| - Log errors for debugging |
| - Provide fallback mechanisms |
|
|
| ### Cost Optimization |
| - Choose cost-effective models for simple tasks |
| - Cache responses when appropriate |
| - Monitor usage in dashboard |
| - Set request limits in code |
|
|
| ## Next Steps |
|
|
| - [Configure Cursor](cursor.md) for IDE integration |
| - [Set up Continue](continue.md) for VSCode |
| - [Explore CLI usage](../cli/basic-usage.md) |
| - [Learn about model selection](../models/overview.md) |
| - [API Reference](../api/reference.md) |
|
|