Co-Pilot
Updated a month ago

typescript-sdk

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

💡 Summary

A TypeScript SDK for seamless integration with 300+ AI models via OpenRouter's unified API.

🎯 Target Audience

Developers building AI applicationsProduct managers integrating AI featuresData scientists leveraging AI modelsStartups exploring AI solutionsEducators teaching AI concepts

🤖 AI Roast:Powerful, but the setup might scare off the impatient.

Security AnalysisHigh Risk

Risk: High. Review: shell/CLI command execution; outbound network access (SSRF, data egress); API keys/tokens handling and storage; dependency pinning and supply-chain risk. Run with least privilege and audit before enabling in production.


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',
5-Dim Analysis
Clarity8/10
Novelty7/10
Utility9/10
Completeness9/10
Maintainability8/10
Pros & Cons

Pros

  • Type-safe interface for developers
  • Supports multiple authentication methods
  • Access to a wide range of AI models
  • Flexible input formats for diverse use cases

Cons

  • Requires API key management
  • Learning curve for new users
  • Dependency on external API availability
  • Potential security risks if keys are mishandled

Related Skills

kode-sdk-csharp

A
toolCo-Pilot
80/ 100

“This SDK is like a Swiss Army knife for AI agents, but does it come with a manual?”

agents-sdk

A
toolCo-Pilot
80/ 100

“The SDK may expose RPC methods, which could lead to unauthorized access if not properly secured. Implement authentication and authorization checks to mitigate risks.”

pytorch

S
toolCode Lib
92/ 100

“It's the Swiss Army knife of deep learning, but good luck figuring out which of the 47 installation methods is the one that won't break your system.”

Disclaimer: This content is sourced from GitHub open source projects for display and rating purposes only.

Copyright belongs to the original author OpenRouterTeam.