typescript-sdk
💡 摘要
一个 TypeScript SDK,用于通过 OpenRouter 的统一 API 无缝集成 300 多个 AI 模型。
🎯 适合人群
🤖 AI 吐槽: “看起来很能打,但别让配置把人劝退。”
风险:High。建议检查:是否执行 shell/命令行指令;是否发起外网请求(SSRF/数据外发);API Key/Token 的获取、存储与泄露风险;依赖锁定与供应链风险。以最小权限运行,并在生产环境启用前审计代码与依赖。
name: openrouter-typescript-sdk description: Complete reference for integrating with 300+ AI models through the OpenRouter TypeScript SDK using the callModel pattern version: 1.0.0
OpenRouter TypeScript SDK
A comprehensive TypeScript SDK for interacting with OpenRouter's unified API, providing access to 300+ AI models through a single, type-safe interface. This skill enables AI agents to leverage the callModel pattern for text generation, tool usage, streaming, and multi-turn conversations.
Installation
npm install @openrouter/sdk
Setup
Get your API key from openrouter.ai/settings/keys, then initialize:
import OpenRouter from '@openrouter/sdk'; const client = new OpenRouter({ apiKey: process.env.OPENROUTER_API_KEY });
Authentication
The SDK supports two authentication methods: API keys for server-side applications and OAuth PKCE flow for user-facing applications.
API Key Authentication
The primary authentication method uses API keys from your OpenRouter account.
Obtaining an API Key
- Visit openrouter.ai/settings/keys
- Create a new API key
- Store securely in an environment variable
Environment Setup
export OPENROUTER_API_KEY=sk-or-v1-your-key-here
Client Initialization
import OpenRouter from '@openrouter/sdk'; const client = new OpenRouter({ apiKey: process.env.OPENROUTER_API_KEY });
The client automatically uses this key for all subsequent requests:
// API key is automatically included const result = client.callModel({ model: 'openai/gpt-5-nano', input: 'Hello!' });
Get Current Key Metadata
Retrieve information about the currently configured API key:
const keyInfo = await client.apiKeys.getCurrentKeyMetadata(); console.log('Key name:', keyInfo.name); console.log('Created:', keyInfo.createdAt);
API Key Management
Programmatically manage API keys:
// List all keys const keys = await client.apiKeys.list(); // Create a new key const newKey = await client.apiKeys.create({ name: 'Production API Key' }); // Get a specific key by hash const key = await client.apiKeys.get({ hash: 'sk-or-v1-...' }); // Update a key await client.apiKeys.update({ hash: 'sk-or-v1-...', requestBody: { name: 'Updated Key Name' } }); // Delete a key await client.apiKeys.delete({ hash: 'sk-or-v1-...' });
OAuth Authentication (PKCE Flow)
For user-facing applications where users should control their own API keys, OpenRouter supports OAuth with PKCE (Proof Key for Code Exchange). This flow allows users to generate API keys through a browser authorization flow without your application handling their credentials.
createAuthCode
Generate an authorization code and URL to start the OAuth flow:
const authResponse = await client.oAuth.createAuthCode({ callbackUrl: 'https://myapp.com/auth/callback' }); // authResponse contains: // - authorizationUrl: URL to redirect the user to // - code: The authorization code for later exchange console.log('Redirect user to:', authResponse.authorizationUrl);
Parameters:
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| callbackUrl | string | Yes | Your application's callback URL after user authorization |
Browser Redirect:
// In a browser environment window.location.href = authResponse.authorizationUrl; // Or in a server-rendered app, return a redirect response res.redirect(authResponse.authorizationUrl);
exchangeAuthCodeForAPIKey
After the user authorizes your application, they are redirected back to your callback URL with an authorization code. Exchange this code for an API key:
// In your callback handler const code = req.query.code; // From the redirect URL const apiKeyResponse = await client.oAuth.exchangeAuthCodeForAPIKey({ code: code }); // apiKeyResponse contains: // - key: The user's API key // - Additional metadata about the key const userApiKey = apiKeyResponse.key; // Store securely for this user's future requests await saveUserApiKey(userId, userApiKey);
Parameters:
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| code | string | Yes | The authorization code from the OAuth redirect |
Complete OAuth Flow Example
import OpenRouter from '@openrouter/sdk'; import express from 'express'; const app = express(); const client = new OpenRouter({ apiKey: process.env.OPENROUTER_API_KEY // Your app's key for OAuth operations }); // Step 1: Initiate OAuth flow app.get('/auth/start', async (req, res) => { const authResponse = await client.oAuth.createAuthCode({ callbackUrl: 'https://myapp.com/auth/callback' }); // Store any state needed for the callback req.session.oauthState = { /* ... */ }; // Redirect user to OpenRouter authorization page res.redirect(authResponse.authorizationUrl); }); // Step 2: Handle callback and exchange code app.get('/auth/callback', async (req, res) => { const { code } = req.query; if (!code) { return res.status(400).send('Authorization code missing'); } try { const apiKeyResponse = await client.oAuth.exchangeAuthCodeForAPIKey({ code: code as string }); // Store the user's API key securely await saveUserApiKey(req.session.userId, apiKeyResponse.key); res.redirect('/dashboard?auth=success'); } catch (error) { console.error('OAuth exchange failed:', error); res.redirect('/auth/error'); } }); // Step 3: Use the user's API key for their requests app.post('/api/chat', async (req, res) => { const userApiKey = await getUserApiKey(req.session.userId); // Create a client with the user's key const userClient = new OpenRouter({ apiKey: userApiKey }); const result = userClient.callModel({ model: 'openai/gpt-5-nano', input: req.body.message }); const text = await result.getText(); res.json({ response: text }); });
Security Best Practices
- Environment Variables: Store API keys in environment variables, never in code
- Key Rotation: Rotate keys periodically using the key management API
- Environment Separation: Use different keys for development, staging, and production
- OAuth for Users: Use the OAuth PKCE flow for user-facing apps to avoid handling user credentials
- Secure Storage: Store user API keys encrypted in your database
- Minimal Scope: Create keys with only the permissions needed
Core Concepts: callModel
The callModel function is the primary interface for text generation. It provides a unified, type-safe way to interact with any supported model.
Basic Usage
const result = client.callModel({ model: 'openai/gpt-5-nano', input: 'Explain quantum computing in one sentence.', }); const text = await result.getText();
Key Benefits
- Type-safe parameters with full IDE autocomplete
- Auto-generated from OpenAPI specs - automatically updates with new models
- Multiple consumption patterns - text, streaming, structured data
- Automatic tool execution with multi-turn support
Input Formats
The SDK accepts flexible input types for the input parameter:
String Input
A simple string becomes a user message:
const result = client.callModel({ model: 'openai/gpt-5-nano', input: 'Hello, how are you?' });
Message Arrays
For multi-turn conversations:
const result = client.callModel({ model: 'openai/gpt-5-nano', input: [ { role: 'user', content: 'What is the capital of France?' }, { role: 'assistant', content: 'The capital of France is Paris.' }, { role: 'user', content: 'What is its population?' } ] });
Multimodal Content
Including images and text:
const result = client.callModel({ model: 'openai/gpt-5-nano', input: [ { role: 'user', content: [ { type: 'text', text: 'What is in this image?' }, { type: 'image_url', image_url: { url: 'https://example.com/image.png' } } ] } ] });
System Instructions
Use the instructions parameter for system-level guidance:
const result = client.callModel({ model: 'openai/gpt-5-nano', instructions: 'You are a helpful coding assistant. Be concise.', input: 'How do I reverse a string in Python?' });
Response Methods
The result object provides multiple methods for consuming the response:
| Method | Purpose |
|--------|---------|
| getText() | Get complete text after all tools complete |
| getResponse() | Full response object with token usage |
| getTextStream() | Stream text deltas as they arrive |
| getReasoningStream() | Stream reasoning tokens (for o1/reasoning models) |
| getToolCallsStream() | Stream tool calls as they complete |
getText()
const result = client.callModel({ model: 'openai/gpt-5-nano', input: 'Write a haiku about coding' }); const text = await result.getText(); console.log(text);
getResponse()
const result = client.callModel({ model: 'openai/gpt-5-nano', input: 'Hello!' }); const response = await result.getResponse(); console.log('Text:', response.text); console.log('Token usage:', response.usage);
getTextStream()
const result = client.callModel({ model: 'openai/gpt-5-nano', input: 'Write a short story' }); for await (const delta of result.getTextStream()) { process.stdout.write(delta); }
Tool System
Create strongly-typed tools using Zod schemas for automatic validation and type inference.
Defining Tools
import { tool } from '@openrouter/sdk'; import { z } from 'zod'; const weatherTool = tool({ name: 'get_weather',
优点
- 为开发人员提供类型安全的接口
- 支持多种身份验证方法
- 访问广泛的 AI 模型
- 灵活的输入格式以满足多种用例
缺点
- 需要 API 密钥管理
- 新用户的学习曲线
- 依赖外部 API 的可用性
- 如果密钥处理不当,可能存在安全风险
相关技能
免责声明:本内容来源于 GitHub 开源项目,仅供展示和评分分析使用。
版权归原作者所有 OpenRouterTeam.
