Co-Pilot / 辅助式
更新于 a month ago

typescript-sdk

OOpenRouterTeam
0.0k
OpenRouterTeam/agent-skills/skills/typescript-sdk
82
Agent 评分

💡 摘要

一个 TypeScript SDK,用于通过 OpenRouter 的统一 API 无缝集成 300 多个 AI 模型。

🎯 适合人群

构建 AI 应用程序的开发人员集成 AI 功能的产品经理利用 AI 模型的数据科学家探索 AI 解决方案的初创公司教授 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

  1. Visit openrouter.ai/settings/keys
  2. Create a new API key
  3. 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

  1. Environment Variables: Store API keys in environment variables, never in code
  2. Key Rotation: Rotate keys periodically using the key management API
  3. Environment Separation: Use different keys for development, staging, and production
  4. OAuth for Users: Use the OAuth PKCE flow for user-facing apps to avoid handling user credentials
  5. Secure Storage: Store user API keys encrypted in your database
  6. 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',
五维分析
清晰度8/10
创新性7/10
实用性9/10
完整性9/10
可维护性8/10
优缺点分析

优点

  • 为开发人员提供类型安全的接口
  • 支持多种身份验证方法
  • 访问广泛的 AI 模型
  • 灵活的输入格式以满足多种用例

缺点

  • 需要 API 密钥管理
  • 新用户的学习曲线
  • 依赖外部 API 的可用性
  • 如果密钥处理不当,可能存在安全风险

相关技能

kode-sdk-csharp

A
toolCo-Pilot / 辅助式
80/ 100

“这个SDK就像是AI代理的瑞士军刀,但它有说明书吗?”

agents-sdk

A
toolCo-Pilot / 辅助式
80/ 100

“该 SDK 可能会暴露 RPC 方法,如果未正确保护,可能导致未经授权的访问。实施身份验证和授权检查以降低风险。”

pytorch

S
toolCode Lib / 代码库
92/ 100

“它是深度学习的瑞士军刀,但祝你好运能从47种安装方法里找到那个不会搞崩你系统的那一个。”

免责声明:本内容来源于 GitHub 开源项目,仅供展示和评分分析使用。

版权归原作者所有 OpenRouterTeam.