@aibtc/mcp-server 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +340 -0
- package/dist/api.d.ts +9 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +79 -0
- package/dist/api.js.map +1 -0
- package/dist/config/contracts.d.ts +169 -0
- package/dist/config/contracts.d.ts.map +1 -0
- package/dist/config/contracts.js +250 -0
- package/dist/config/contracts.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +3 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/networks.d.ts +11 -0
- package/dist/config/networks.d.ts.map +1 -0
- package/dist/config/networks.js +21 -0
- package/dist/config/networks.js.map +1 -0
- package/dist/endpoints/index.d.ts +2 -0
- package/dist/endpoints/index.d.ts.map +1 -0
- package/dist/endpoints/index.js +2 -0
- package/dist/endpoints/index.js.map +1 -0
- package/dist/endpoints/registry.d.ts +38 -0
- package/dist/endpoints/registry.d.ts.map +1 -0
- package/dist/endpoints/registry.js +935 -0
- package/dist/endpoints/registry.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +79 -0
- package/dist/index.js.map +1 -0
- package/dist/services/bitflow.service.d.ts +159 -0
- package/dist/services/bitflow.service.d.ts.map +1 -0
- package/dist/services/bitflow.service.js +325 -0
- package/dist/services/bitflow.service.js.map +1 -0
- package/dist/services/bns.service.d.ts +87 -0
- package/dist/services/bns.service.d.ts.map +1 -0
- package/dist/services/bns.service.js +312 -0
- package/dist/services/bns.service.js.map +1 -0
- package/dist/services/defi.service.d.ts +146 -0
- package/dist/services/defi.service.d.ts.map +1 -0
- package/dist/services/defi.service.js +461 -0
- package/dist/services/defi.service.js.map +1 -0
- package/dist/services/hiro-api.d.ts +438 -0
- package/dist/services/hiro-api.d.ts.map +1 -0
- package/dist/services/hiro-api.js +376 -0
- package/dist/services/hiro-api.js.map +1 -0
- package/dist/services/nft.service.d.ts +70 -0
- package/dist/services/nft.service.d.ts.map +1 -0
- package/dist/services/nft.service.js +148 -0
- package/dist/services/nft.service.js.map +1 -0
- package/dist/services/sbtc.service.d.ts +44 -0
- package/dist/services/sbtc.service.d.ts.map +1 -0
- package/dist/services/sbtc.service.js +100 -0
- package/dist/services/sbtc.service.js.map +1 -0
- package/dist/services/scaffold.service.d.ts +41 -0
- package/dist/services/scaffold.service.d.ts.map +1 -0
- package/dist/services/scaffold.service.js +1055 -0
- package/dist/services/scaffold.service.js.map +1 -0
- package/dist/services/stacking.service.d.ts +58 -0
- package/dist/services/stacking.service.d.ts.map +1 -0
- package/dist/services/stacking.service.js +153 -0
- package/dist/services/stacking.service.js.map +1 -0
- package/dist/services/tokens.service.d.ts +62 -0
- package/dist/services/tokens.service.d.ts.map +1 -0
- package/dist/services/tokens.service.js +119 -0
- package/dist/services/tokens.service.js.map +1 -0
- package/dist/services/wallet-manager.d.ts +107 -0
- package/dist/services/wallet-manager.d.ts.map +1 -0
- package/dist/services/wallet-manager.js +389 -0
- package/dist/services/wallet-manager.js.map +1 -0
- package/dist/services/x402.service.d.ts +26 -0
- package/dist/services/x402.service.d.ts.map +1 -0
- package/dist/services/x402.service.js +125 -0
- package/dist/services/x402.service.js.map +1 -0
- package/dist/tools/bitflow.tools.d.ts +3 -0
- package/dist/tools/bitflow.tools.d.ts.map +1 -0
- package/dist/tools/bitflow.tools.js +501 -0
- package/dist/tools/bitflow.tools.js.map +1 -0
- package/dist/tools/bns.tools.d.ts +3 -0
- package/dist/tools/bns.tools.d.ts.map +1 -0
- package/dist/tools/bns.tools.js +164 -0
- package/dist/tools/bns.tools.js.map +1 -0
- package/dist/tools/contract.tools.d.ts +3 -0
- package/dist/tools/contract.tools.d.ts.map +1 -0
- package/dist/tools/contract.tools.js +126 -0
- package/dist/tools/contract.tools.js.map +1 -0
- package/dist/tools/defi.tools.d.ts +3 -0
- package/dist/tools/defi.tools.d.ts.map +1 -0
- package/dist/tools/defi.tools.js +425 -0
- package/dist/tools/defi.tools.js.map +1 -0
- package/dist/tools/endpoint.tools.d.ts +3 -0
- package/dist/tools/endpoint.tools.d.ts.map +1 -0
- package/dist/tools/endpoint.tools.js +157 -0
- package/dist/tools/endpoint.tools.js.map +1 -0
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +52 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/nft.tools.d.ts +3 -0
- package/dist/tools/nft.tools.d.ts.map +1 -0
- package/dist/tools/nft.tools.js +154 -0
- package/dist/tools/nft.tools.js.map +1 -0
- package/dist/tools/openrouter.tools.d.ts +3 -0
- package/dist/tools/openrouter.tools.d.ts.map +1 -0
- package/dist/tools/openrouter.tools.js +664 -0
- package/dist/tools/openrouter.tools.js.map +1 -0
- package/dist/tools/query.tools.d.ts +3 -0
- package/dist/tools/query.tools.d.ts.map +1 -0
- package/dist/tools/query.tools.js +209 -0
- package/dist/tools/query.tools.js.map +1 -0
- package/dist/tools/sbtc.tools.d.ts +3 -0
- package/dist/tools/sbtc.tools.d.ts.map +1 -0
- package/dist/tools/sbtc.tools.js +103 -0
- package/dist/tools/sbtc.tools.js.map +1 -0
- package/dist/tools/scaffold.tools.d.ts +3 -0
- package/dist/tools/scaffold.tools.d.ts.map +1 -0
- package/dist/tools/scaffold.tools.js +216 -0
- package/dist/tools/scaffold.tools.js.map +1 -0
- package/dist/tools/stacking.tools.d.ts +3 -0
- package/dist/tools/stacking.tools.d.ts.map +1 -0
- package/dist/tools/stacking.tools.js +112 -0
- package/dist/tools/stacking.tools.js.map +1 -0
- package/dist/tools/tokens.tools.d.ts +3 -0
- package/dist/tools/tokens.tools.d.ts.map +1 -0
- package/dist/tools/tokens.tools.js +154 -0
- package/dist/tools/tokens.tools.js.map +1 -0
- package/dist/tools/transfer.tools.d.ts +3 -0
- package/dist/tools/transfer.tools.d.ts.map +1 -0
- package/dist/tools/transfer.tools.js +62 -0
- package/dist/tools/transfer.tools.js.map +1 -0
- package/dist/tools/wallet-management.tools.d.ts +6 -0
- package/dist/tools/wallet-management.tools.d.ts.map +1 -0
- package/dist/tools/wallet-management.tools.js +390 -0
- package/dist/tools/wallet-management.tools.js.map +1 -0
- package/dist/tools/wallet.tools.d.ts +3 -0
- package/dist/tools/wallet.tools.d.ts.map +1 -0
- package/dist/tools/wallet.tools.js +105 -0
- package/dist/tools/wallet.tools.js.map +1 -0
- package/dist/transactions/builder.d.ts +56 -0
- package/dist/transactions/builder.d.ts.map +1 -0
- package/dist/transactions/builder.js +134 -0
- package/dist/transactions/builder.js.map +1 -0
- package/dist/transactions/clarity-values.d.ts +67 -0
- package/dist/transactions/clarity-values.d.ts.map +1 -0
- package/dist/transactions/clarity-values.js +169 -0
- package/dist/transactions/clarity-values.js.map +1 -0
- package/dist/transactions/post-conditions.d.ts +27 -0
- package/dist/transactions/post-conditions.d.ts.map +1 -0
- package/dist/transactions/post-conditions.js +101 -0
- package/dist/transactions/post-conditions.js.map +1 -0
- package/dist/utils/encryption.d.ts +33 -0
- package/dist/utils/encryption.d.ts.map +1 -0
- package/dist/utils/encryption.js +110 -0
- package/dist/utils/encryption.js.map +1 -0
- package/dist/utils/errors.d.ts +84 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +132 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/formatting.d.ts +51 -0
- package/dist/utils/formatting.d.ts.map +1 -0
- package/dist/utils/formatting.js +114 -0
- package/dist/utils/formatting.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/storage.d.ts +90 -0
- package/dist/utils/storage.d.ts.map +1 -0
- package/dist/utils/storage.js +196 -0
- package/dist/utils/storage.js.map +1 -0
- package/dist/utils/validation.d.ts +67 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +74 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/wallet.d.ts +86 -0
- package/dist/wallet.d.ts.map +1 -0
- package/dist/wallet.js +279 -0
- package/dist/wallet.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,664 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { createJsonResponse } from "../utils/index.js";
|
|
3
|
+
export function registerOpenRouterTools(server) {
|
|
4
|
+
server.registerTool("openrouter_integration_guide", {
|
|
5
|
+
description: `Get OpenRouter integration examples and code patterns for implementing AI features.
|
|
6
|
+
|
|
7
|
+
Use this tool when you need to add AI capabilities to any project. Returns:
|
|
8
|
+
- Code examples for different environments (Node.js, Cloudflare Workers, browser)
|
|
9
|
+
- API patterns and best practices
|
|
10
|
+
- Model recommendations
|
|
11
|
+
- Error handling patterns
|
|
12
|
+
|
|
13
|
+
This is a reference tool - use the returned code as a template for implementation.`,
|
|
14
|
+
inputSchema: {
|
|
15
|
+
environment: z
|
|
16
|
+
.enum(["nodejs", "cloudflare-worker", "browser", "all"])
|
|
17
|
+
.optional()
|
|
18
|
+
.default("all")
|
|
19
|
+
.describe("Target environment for the integration"),
|
|
20
|
+
feature: z
|
|
21
|
+
.enum(["chat", "completion", "streaming", "function-calling", "all"])
|
|
22
|
+
.optional()
|
|
23
|
+
.default("all")
|
|
24
|
+
.describe("Specific AI feature to implement"),
|
|
25
|
+
},
|
|
26
|
+
}, async ({ environment, feature }) => {
|
|
27
|
+
const guides = {};
|
|
28
|
+
// Base API info
|
|
29
|
+
guides.apiOverview = `
|
|
30
|
+
# OpenRouter API Overview
|
|
31
|
+
|
|
32
|
+
Base URL: https://openrouter.ai/api/v1
|
|
33
|
+
Auth: Bearer token in Authorization header
|
|
34
|
+
API Key: Get from https://openrouter.ai/keys
|
|
35
|
+
|
|
36
|
+
## Request Format
|
|
37
|
+
POST /chat/completions
|
|
38
|
+
{
|
|
39
|
+
"model": "anthropic/claude-3-haiku",
|
|
40
|
+
"messages": [
|
|
41
|
+
{ "role": "system", "content": "You are helpful" },
|
|
42
|
+
{ "role": "user", "content": "Hello" }
|
|
43
|
+
],
|
|
44
|
+
"max_tokens": 1024,
|
|
45
|
+
"temperature": 0.7
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
## Required Headers
|
|
49
|
+
- Authorization: Bearer YOUR_API_KEY
|
|
50
|
+
- Content-Type: application/json
|
|
51
|
+
- HTTP-Referer: your-site.com (for rankings)
|
|
52
|
+
- X-Title: Your App Name (for rankings)
|
|
53
|
+
`;
|
|
54
|
+
guides.popularModels = `
|
|
55
|
+
# Popular Models
|
|
56
|
+
|
|
57
|
+
## Fast & Affordable
|
|
58
|
+
- anthropic/claude-3.5-haiku - Fast, cheap, 200K context
|
|
59
|
+
- openai/gpt-4o-mini - Very fast, 128K context
|
|
60
|
+
- meta-llama/llama-3.3-70b-instruct - Great value, 131K context
|
|
61
|
+
- google/gemini-2.5-flash - 1M context, very cheap
|
|
62
|
+
- mistralai/mistral-nemo - Ultra cheap, 131K context
|
|
63
|
+
|
|
64
|
+
## High Quality (Frontier)
|
|
65
|
+
- anthropic/claude-sonnet-4.5 - Best overall, 1M context
|
|
66
|
+
- anthropic/claude-opus-4.5 - Most capable, 200K context
|
|
67
|
+
- openai/gpt-4.1 - 1M context, multimodal
|
|
68
|
+
- openai/gpt-4o - Solid all-rounder, 128K context
|
|
69
|
+
- google/gemini-2.5-pro - 1M context, great reasoning
|
|
70
|
+
- x-ai/grok-4 - xAI flagship, 256K context
|
|
71
|
+
|
|
72
|
+
## Code & Reasoning
|
|
73
|
+
- deepseek/deepseek-r1 - Excellent reasoning, 163K context
|
|
74
|
+
- deepseek/deepseek-v3.2 - Fast coding, very cheap
|
|
75
|
+
- mistralai/mistral-large-2411 - Strong coder, 131K context
|
|
76
|
+
|
|
77
|
+
## Long Context
|
|
78
|
+
- x-ai/grok-4.1-fast - 2M context (!), very cheap
|
|
79
|
+
- google/gemini-2.5-pro - 1M context
|
|
80
|
+
- anthropic/claude-sonnet-4.5 - 1M context
|
|
81
|
+
|
|
82
|
+
## Open Source
|
|
83
|
+
- meta-llama/llama-3.1-405b-instruct - Largest open model
|
|
84
|
+
- meta-llama/llama-3.3-70b-instruct - Best open value
|
|
85
|
+
- qwen/qwen3-235b - Strong multilingual
|
|
86
|
+
`;
|
|
87
|
+
// Environment-specific examples
|
|
88
|
+
if (environment === "nodejs" || environment === "all") {
|
|
89
|
+
guides.nodejs = `
|
|
90
|
+
# Node.js Integration
|
|
91
|
+
|
|
92
|
+
## Basic Implementation
|
|
93
|
+
|
|
94
|
+
\`\`\`typescript
|
|
95
|
+
// openrouter.ts
|
|
96
|
+
interface ChatMessage {
|
|
97
|
+
role: 'system' | 'user' | 'assistant';
|
|
98
|
+
content: string;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
interface OpenRouterResponse {
|
|
102
|
+
content: string;
|
|
103
|
+
model: string;
|
|
104
|
+
usage: { promptTokens: number; completionTokens: number; totalTokens: number };
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export async function chat(
|
|
108
|
+
messages: ChatMessage[],
|
|
109
|
+
model = 'anthropic/claude-3-haiku',
|
|
110
|
+
options: { maxTokens?: number; temperature?: number } = {}
|
|
111
|
+
): Promise<OpenRouterResponse> {
|
|
112
|
+
const response = await fetch('https://openrouter.ai/api/v1/chat/completions', {
|
|
113
|
+
method: 'POST',
|
|
114
|
+
headers: {
|
|
115
|
+
'Authorization': \`Bearer \${process.env.OPENROUTER_API_KEY}\`,
|
|
116
|
+
'Content-Type': 'application/json',
|
|
117
|
+
'HTTP-Referer': 'https://your-site.com',
|
|
118
|
+
'X-Title': 'Your App',
|
|
119
|
+
},
|
|
120
|
+
body: JSON.stringify({
|
|
121
|
+
model,
|
|
122
|
+
messages,
|
|
123
|
+
max_tokens: options.maxTokens || 1024,
|
|
124
|
+
temperature: options.temperature || 0.7,
|
|
125
|
+
}),
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
if (!response.ok) {
|
|
129
|
+
const error = await response.text();
|
|
130
|
+
throw new Error(\`OpenRouter error: \${response.status} - \${error}\`);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const data = await response.json();
|
|
134
|
+
return {
|
|
135
|
+
content: data.choices[0]?.message?.content || '',
|
|
136
|
+
model: data.model,
|
|
137
|
+
usage: {
|
|
138
|
+
promptTokens: data.usage.prompt_tokens,
|
|
139
|
+
completionTokens: data.usage.completion_tokens,
|
|
140
|
+
totalTokens: data.usage.total_tokens,
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Usage
|
|
146
|
+
const result = await chat([
|
|
147
|
+
{ role: 'system', content: 'You are a helpful assistant.' },
|
|
148
|
+
{ role: 'user', content: 'Explain quantum computing' },
|
|
149
|
+
]);
|
|
150
|
+
console.log(result.content);
|
|
151
|
+
\`\`\`
|
|
152
|
+
|
|
153
|
+
## With Axios
|
|
154
|
+
|
|
155
|
+
\`\`\`typescript
|
|
156
|
+
import axios from 'axios';
|
|
157
|
+
|
|
158
|
+
const openrouter = axios.create({
|
|
159
|
+
baseURL: 'https://openrouter.ai/api/v1',
|
|
160
|
+
headers: {
|
|
161
|
+
'Authorization': \`Bearer \${process.env.OPENROUTER_API_KEY}\`,
|
|
162
|
+
'HTTP-Referer': 'https://your-site.com',
|
|
163
|
+
'X-Title': 'Your App',
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
export async function chat(messages: ChatMessage[], model = 'anthropic/claude-3-haiku') {
|
|
168
|
+
const { data } = await openrouter.post('/chat/completions', {
|
|
169
|
+
model,
|
|
170
|
+
messages,
|
|
171
|
+
max_tokens: 1024,
|
|
172
|
+
});
|
|
173
|
+
return data.choices[0]?.message?.content || '';
|
|
174
|
+
}
|
|
175
|
+
\`\`\`
|
|
176
|
+
`;
|
|
177
|
+
}
|
|
178
|
+
if (environment === "cloudflare-worker" || environment === "all") {
|
|
179
|
+
guides.cloudflareWorker = `
|
|
180
|
+
# Cloudflare Worker Integration
|
|
181
|
+
|
|
182
|
+
## With Hono.js
|
|
183
|
+
|
|
184
|
+
\`\`\`typescript
|
|
185
|
+
// src/index.ts
|
|
186
|
+
import { Hono } from 'hono';
|
|
187
|
+
|
|
188
|
+
type Bindings = {
|
|
189
|
+
OPENROUTER_API_KEY: string;
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
const app = new Hono<{ Bindings: Bindings }>();
|
|
193
|
+
|
|
194
|
+
app.post('/api/chat', async (c) => {
|
|
195
|
+
const { messages, model = 'anthropic/claude-3-haiku' } = await c.req.json();
|
|
196
|
+
|
|
197
|
+
const response = await fetch('https://openrouter.ai/api/v1/chat/completions', {
|
|
198
|
+
method: 'POST',
|
|
199
|
+
headers: {
|
|
200
|
+
'Authorization': \`Bearer \${c.env.OPENROUTER_API_KEY}\`,
|
|
201
|
+
'Content-Type': 'application/json',
|
|
202
|
+
'HTTP-Referer': 'https://your-worker.workers.dev',
|
|
203
|
+
'X-Title': 'My Worker',
|
|
204
|
+
},
|
|
205
|
+
body: JSON.stringify({
|
|
206
|
+
model,
|
|
207
|
+
messages,
|
|
208
|
+
max_tokens: 1024,
|
|
209
|
+
}),
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
if (!response.ok) {
|
|
213
|
+
return c.json({ error: 'AI request failed' }, 500);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
const data = await response.json();
|
|
217
|
+
return c.json({
|
|
218
|
+
content: data.choices[0]?.message?.content,
|
|
219
|
+
model: data.model,
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
export default app;
|
|
224
|
+
\`\`\`
|
|
225
|
+
|
|
226
|
+
## wrangler.jsonc
|
|
227
|
+
|
|
228
|
+
\`\`\`json
|
|
229
|
+
{
|
|
230
|
+
"name": "my-ai-worker",
|
|
231
|
+
"main": "src/index.ts",
|
|
232
|
+
"compatibility_date": "2024-01-01",
|
|
233
|
+
"compatibility_flags": ["nodejs_compat"]
|
|
234
|
+
}
|
|
235
|
+
\`\`\`
|
|
236
|
+
|
|
237
|
+
## Set API Key as Secret
|
|
238
|
+
|
|
239
|
+
\`\`\`bash
|
|
240
|
+
wrangler secret put OPENROUTER_API_KEY
|
|
241
|
+
\`\`\`
|
|
242
|
+
`;
|
|
243
|
+
}
|
|
244
|
+
if (environment === "browser" || environment === "all") {
|
|
245
|
+
guides.browser = `
|
|
246
|
+
# Browser Integration
|
|
247
|
+
|
|
248
|
+
⚠️ IMPORTANT: Never expose API keys in browser code!
|
|
249
|
+
Use a backend proxy to keep your key secure.
|
|
250
|
+
|
|
251
|
+
## Backend Proxy Pattern
|
|
252
|
+
|
|
253
|
+
\`\`\`typescript
|
|
254
|
+
// Backend (Express/Hono/etc)
|
|
255
|
+
app.post('/api/ai/chat', async (req, res) => {
|
|
256
|
+
const { messages, model } = req.body;
|
|
257
|
+
|
|
258
|
+
const response = await fetch('https://openrouter.ai/api/v1/chat/completions', {
|
|
259
|
+
method: 'POST',
|
|
260
|
+
headers: {
|
|
261
|
+
'Authorization': \`Bearer \${process.env.OPENROUTER_API_KEY}\`,
|
|
262
|
+
'Content-Type': 'application/json',
|
|
263
|
+
},
|
|
264
|
+
body: JSON.stringify({ model, messages, max_tokens: 1024 }),
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
const data = await response.json();
|
|
268
|
+
res.json({ content: data.choices[0]?.message?.content });
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
// Frontend
|
|
272
|
+
async function chat(message: string) {
|
|
273
|
+
const response = await fetch('/api/ai/chat', {
|
|
274
|
+
method: 'POST',
|
|
275
|
+
headers: { 'Content-Type': 'application/json' },
|
|
276
|
+
body: JSON.stringify({
|
|
277
|
+
model: 'anthropic/claude-3-haiku',
|
|
278
|
+
messages: [{ role: 'user', content: message }],
|
|
279
|
+
}),
|
|
280
|
+
});
|
|
281
|
+
return response.json();
|
|
282
|
+
}
|
|
283
|
+
\`\`\`
|
|
284
|
+
`;
|
|
285
|
+
}
|
|
286
|
+
// Feature-specific examples
|
|
287
|
+
if (feature === "streaming" || feature === "all") {
|
|
288
|
+
guides.streaming = `
|
|
289
|
+
# Streaming Responses
|
|
290
|
+
|
|
291
|
+
## Server-Sent Events Pattern
|
|
292
|
+
|
|
293
|
+
\`\`\`typescript
|
|
294
|
+
// Request with streaming
|
|
295
|
+
const response = await fetch('https://openrouter.ai/api/v1/chat/completions', {
|
|
296
|
+
method: 'POST',
|
|
297
|
+
headers: {
|
|
298
|
+
'Authorization': \`Bearer \${apiKey}\`,
|
|
299
|
+
'Content-Type': 'application/json',
|
|
300
|
+
},
|
|
301
|
+
body: JSON.stringify({
|
|
302
|
+
model: 'anthropic/claude-3-haiku',
|
|
303
|
+
messages: [{ role: 'user', content: 'Tell me a story' }],
|
|
304
|
+
stream: true, // Enable streaming
|
|
305
|
+
}),
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
// Process stream
|
|
309
|
+
const reader = response.body?.getReader();
|
|
310
|
+
const decoder = new TextDecoder();
|
|
311
|
+
|
|
312
|
+
while (true) {
|
|
313
|
+
const { done, value } = await reader.read();
|
|
314
|
+
if (done) break;
|
|
315
|
+
|
|
316
|
+
const chunk = decoder.decode(value);
|
|
317
|
+
const lines = chunk.split('\\n').filter(line => line.startsWith('data: '));
|
|
318
|
+
|
|
319
|
+
for (const line of lines) {
|
|
320
|
+
const data = line.slice(6); // Remove 'data: '
|
|
321
|
+
if (data === '[DONE]') continue;
|
|
322
|
+
|
|
323
|
+
const parsed = JSON.parse(data);
|
|
324
|
+
const content = parsed.choices[0]?.delta?.content || '';
|
|
325
|
+
process.stdout.write(content); // Stream to output
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
\`\`\`
|
|
329
|
+
|
|
330
|
+
## Hono Streaming Response
|
|
331
|
+
|
|
332
|
+
\`\`\`typescript
|
|
333
|
+
import { stream } from 'hono/streaming';
|
|
334
|
+
|
|
335
|
+
app.post('/api/chat/stream', async (c) => {
|
|
336
|
+
const { messages } = await c.req.json();
|
|
337
|
+
|
|
338
|
+
return stream(c, async (stream) => {
|
|
339
|
+
const response = await fetch('https://openrouter.ai/api/v1/chat/completions', {
|
|
340
|
+
method: 'POST',
|
|
341
|
+
headers: {
|
|
342
|
+
'Authorization': \`Bearer \${c.env.OPENROUTER_API_KEY}\`,
|
|
343
|
+
'Content-Type': 'application/json',
|
|
344
|
+
},
|
|
345
|
+
body: JSON.stringify({
|
|
346
|
+
model: 'anthropic/claude-3-haiku',
|
|
347
|
+
messages,
|
|
348
|
+
stream: true,
|
|
349
|
+
}),
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
const reader = response.body?.getReader();
|
|
353
|
+
const decoder = new TextDecoder();
|
|
354
|
+
|
|
355
|
+
while (true) {
|
|
356
|
+
const { done, value } = await reader?.read() || { done: true };
|
|
357
|
+
if (done) break;
|
|
358
|
+
await stream.write(decoder.decode(value));
|
|
359
|
+
}
|
|
360
|
+
});
|
|
361
|
+
});
|
|
362
|
+
\`\`\`
|
|
363
|
+
`;
|
|
364
|
+
}
|
|
365
|
+
if (feature === "function-calling" || feature === "all") {
|
|
366
|
+
guides.functionCalling = `
|
|
367
|
+
# Function Calling (Tool Use)
|
|
368
|
+
|
|
369
|
+
Some models support function calling for structured outputs.
|
|
370
|
+
|
|
371
|
+
\`\`\`typescript
|
|
372
|
+
const response = await fetch('https://openrouter.ai/api/v1/chat/completions', {
|
|
373
|
+
method: 'POST',
|
|
374
|
+
headers: {
|
|
375
|
+
'Authorization': \`Bearer \${apiKey}\`,
|
|
376
|
+
'Content-Type': 'application/json',
|
|
377
|
+
},
|
|
378
|
+
body: JSON.stringify({
|
|
379
|
+
model: 'openai/gpt-4o', // Supports function calling
|
|
380
|
+
messages: [{ role: 'user', content: 'What is the weather in Tokyo?' }],
|
|
381
|
+
tools: [
|
|
382
|
+
{
|
|
383
|
+
type: 'function',
|
|
384
|
+
function: {
|
|
385
|
+
name: 'get_weather',
|
|
386
|
+
description: 'Get the current weather in a location',
|
|
387
|
+
parameters: {
|
|
388
|
+
type: 'object',
|
|
389
|
+
properties: {
|
|
390
|
+
location: { type: 'string', description: 'City name' },
|
|
391
|
+
unit: { type: 'string', enum: ['celsius', 'fahrenheit'] },
|
|
392
|
+
},
|
|
393
|
+
required: ['location'],
|
|
394
|
+
},
|
|
395
|
+
},
|
|
396
|
+
},
|
|
397
|
+
],
|
|
398
|
+
tool_choice: 'auto',
|
|
399
|
+
}),
|
|
400
|
+
});
|
|
401
|
+
|
|
402
|
+
const data = await response.json();
|
|
403
|
+
const toolCall = data.choices[0]?.message?.tool_calls?.[0];
|
|
404
|
+
|
|
405
|
+
if (toolCall) {
|
|
406
|
+
const args = JSON.parse(toolCall.function.arguments);
|
|
407
|
+
// Call your actual function: getWeather(args.location, args.unit)
|
|
408
|
+
}
|
|
409
|
+
\`\`\`
|
|
410
|
+
|
|
411
|
+
## Models with Function Calling Support
|
|
412
|
+
- openai/gpt-4o, gpt-4-turbo
|
|
413
|
+
- anthropic/claude-3.5-sonnet, claude-3-opus
|
|
414
|
+
- mistralai/mistral-large
|
|
415
|
+
`;
|
|
416
|
+
}
|
|
417
|
+
guides.errorHandling = `
|
|
418
|
+
# Error Handling
|
|
419
|
+
|
|
420
|
+
\`\`\`typescript
|
|
421
|
+
async function safeChat(messages: ChatMessage[], model: string) {
|
|
422
|
+
try {
|
|
423
|
+
const response = await fetch('https://openrouter.ai/api/v1/chat/completions', {
|
|
424
|
+
method: 'POST',
|
|
425
|
+
headers: {
|
|
426
|
+
'Authorization': \`Bearer \${apiKey}\`,
|
|
427
|
+
'Content-Type': 'application/json',
|
|
428
|
+
},
|
|
429
|
+
body: JSON.stringify({ model, messages, max_tokens: 1024 }),
|
|
430
|
+
});
|
|
431
|
+
|
|
432
|
+
if (response.status === 401) {
|
|
433
|
+
throw new Error('Invalid API key');
|
|
434
|
+
}
|
|
435
|
+
if (response.status === 429) {
|
|
436
|
+
throw new Error('Rate limited - try again later');
|
|
437
|
+
}
|
|
438
|
+
if (response.status === 402) {
|
|
439
|
+
throw new Error('Insufficient credits');
|
|
440
|
+
}
|
|
441
|
+
if (!response.ok) {
|
|
442
|
+
const error = await response.text();
|
|
443
|
+
throw new Error(\`API error: \${response.status} - \${error}\`);
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
const data = await response.json();
|
|
447
|
+
return data.choices[0]?.message?.content || '';
|
|
448
|
+
} catch (error) {
|
|
449
|
+
console.error('OpenRouter error:', error);
|
|
450
|
+
throw error;
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
\`\`\`
|
|
454
|
+
|
|
455
|
+
## Common Error Codes
|
|
456
|
+
- 401: Invalid API key
|
|
457
|
+
- 402: Out of credits
|
|
458
|
+
- 429: Rate limited
|
|
459
|
+
- 500: Server error (retry)
|
|
460
|
+
- 503: Model overloaded (retry with backoff)
|
|
461
|
+
`;
|
|
462
|
+
guides.bestPractices = `
|
|
463
|
+
# Best Practices
|
|
464
|
+
|
|
465
|
+
1. **Store API key securely**
|
|
466
|
+
- Use environment variables
|
|
467
|
+
- Never commit to git
|
|
468
|
+
- Use secrets manager in production
|
|
469
|
+
|
|
470
|
+
2. **Set reasonable max_tokens**
|
|
471
|
+
- Don't set higher than needed
|
|
472
|
+
- Affects cost and latency
|
|
473
|
+
|
|
474
|
+
3. **Use appropriate temperature**
|
|
475
|
+
- 0.0-0.3: Factual, deterministic
|
|
476
|
+
- 0.5-0.7: Balanced (default)
|
|
477
|
+
- 0.8-1.0: Creative, varied
|
|
478
|
+
|
|
479
|
+
4. **Handle rate limits**
|
|
480
|
+
- Implement exponential backoff
|
|
481
|
+
- Cache responses when possible
|
|
482
|
+
|
|
483
|
+
5. **Choose the right model**
|
|
484
|
+
- Start with claude-3-haiku or gpt-4o-mini
|
|
485
|
+
- Upgrade only if quality insufficient
|
|
486
|
+
`;
|
|
487
|
+
return createJsonResponse({
|
|
488
|
+
environment,
|
|
489
|
+
feature,
|
|
490
|
+
guides,
|
|
491
|
+
tip: "Use these code examples as templates. Replace placeholders with your actual values.",
|
|
492
|
+
});
|
|
493
|
+
});
|
|
494
|
+
// List available models
|
|
495
|
+
server.registerTool("openrouter_models", {
|
|
496
|
+
description: `Get list of popular OpenRouter models with capabilities and context lengths.
|
|
497
|
+
|
|
498
|
+
Use this to choose the right model for your use case. For latest pricing, check openrouter.ai/models`,
|
|
499
|
+
inputSchema: {
|
|
500
|
+
category: z
|
|
501
|
+
.enum(["fast", "quality", "cheap", "code", "long-context", "all"])
|
|
502
|
+
.optional()
|
|
503
|
+
.default("all")
|
|
504
|
+
.describe("Filter by model category"),
|
|
505
|
+
},
|
|
506
|
+
}, async ({ category }) => {
|
|
507
|
+
const allModels = [
|
|
508
|
+
// Anthropic
|
|
509
|
+
{
|
|
510
|
+
id: "anthropic/claude-3.5-haiku",
|
|
511
|
+
name: "Claude 3.5 Haiku",
|
|
512
|
+
category: ["fast", "cheap"],
|
|
513
|
+
contextLength: 200000,
|
|
514
|
+
bestFor: "Fast responses, simple tasks, cost-effective",
|
|
515
|
+
},
|
|
516
|
+
{
|
|
517
|
+
id: "anthropic/claude-sonnet-4.5",
|
|
518
|
+
name: "Claude Sonnet 4.5",
|
|
519
|
+
category: ["quality", "long-context"],
|
|
520
|
+
contextLength: 1000000,
|
|
521
|
+
bestFor: "Best overall, complex reasoning, coding",
|
|
522
|
+
},
|
|
523
|
+
{
|
|
524
|
+
id: "anthropic/claude-opus-4.5",
|
|
525
|
+
name: "Claude Opus 4.5",
|
|
526
|
+
category: ["quality"],
|
|
527
|
+
contextLength: 200000,
|
|
528
|
+
bestFor: "Most capable, research, difficult tasks",
|
|
529
|
+
},
|
|
530
|
+
// OpenAI
|
|
531
|
+
{
|
|
532
|
+
id: "openai/gpt-4o",
|
|
533
|
+
name: "GPT-4o",
|
|
534
|
+
category: ["quality"],
|
|
535
|
+
contextLength: 128000,
|
|
536
|
+
bestFor: "General purpose, multimodal, function calling",
|
|
537
|
+
},
|
|
538
|
+
{
|
|
539
|
+
id: "openai/gpt-4o-mini",
|
|
540
|
+
name: "GPT-4o Mini",
|
|
541
|
+
category: ["fast", "cheap"],
|
|
542
|
+
contextLength: 128000,
|
|
543
|
+
bestFor: "Fast, cheap, good for simple tasks",
|
|
544
|
+
},
|
|
545
|
+
{
|
|
546
|
+
id: "openai/gpt-4.1",
|
|
547
|
+
name: "GPT-4.1",
|
|
548
|
+
category: ["quality", "long-context"],
|
|
549
|
+
contextLength: 1040000,
|
|
550
|
+
bestFor: "Long context, multimodal, latest OpenAI",
|
|
551
|
+
},
|
|
552
|
+
// Meta Llama
|
|
553
|
+
{
|
|
554
|
+
id: "meta-llama/llama-3.3-70b-instruct",
|
|
555
|
+
name: "Llama 3.3 70B",
|
|
556
|
+
category: ["quality", "cheap"],
|
|
557
|
+
contextLength: 131072,
|
|
558
|
+
bestFor: "Best open source value, great quality",
|
|
559
|
+
},
|
|
560
|
+
{
|
|
561
|
+
id: "meta-llama/llama-3.1-405b-instruct",
|
|
562
|
+
name: "Llama 3.1 405B",
|
|
563
|
+
category: ["quality"],
|
|
564
|
+
contextLength: 131072,
|
|
565
|
+
bestFor: "Largest open model, frontier performance",
|
|
566
|
+
},
|
|
567
|
+
{
|
|
568
|
+
id: "meta-llama/llama-3.1-8b-instruct",
|
|
569
|
+
name: "Llama 3.1 8B",
|
|
570
|
+
category: ["fast", "cheap"],
|
|
571
|
+
contextLength: 16384,
|
|
572
|
+
bestFor: "Ultra cheap, fast, simple tasks",
|
|
573
|
+
},
|
|
574
|
+
// Google
|
|
575
|
+
{
|
|
576
|
+
id: "google/gemini-2.5-pro",
|
|
577
|
+
name: "Gemini 2.5 Pro",
|
|
578
|
+
category: ["quality", "long-context"],
|
|
579
|
+
contextLength: 1000000,
|
|
580
|
+
bestFor: "1M context, great reasoning, multimodal",
|
|
581
|
+
},
|
|
582
|
+
{
|
|
583
|
+
id: "google/gemini-2.5-flash",
|
|
584
|
+
name: "Gemini 2.5 Flash",
|
|
585
|
+
category: ["fast", "cheap", "long-context"],
|
|
586
|
+
contextLength: 1000000,
|
|
587
|
+
bestFor: "Fast, 1M context, affordable",
|
|
588
|
+
},
|
|
589
|
+
// xAI Grok
|
|
590
|
+
{
|
|
591
|
+
id: "x-ai/grok-4",
|
|
592
|
+
name: "Grok 4",
|
|
593
|
+
category: ["quality"],
|
|
594
|
+
contextLength: 256000,
|
|
595
|
+
bestFor: "xAI flagship, real-time knowledge",
|
|
596
|
+
},
|
|
597
|
+
{
|
|
598
|
+
id: "x-ai/grok-4.1-fast",
|
|
599
|
+
name: "Grok 4.1 Fast",
|
|
600
|
+
category: ["fast", "long-context"],
|
|
601
|
+
contextLength: 2000000,
|
|
602
|
+
bestFor: "2M context (!), very fast",
|
|
603
|
+
},
|
|
604
|
+
{
|
|
605
|
+
id: "x-ai/grok-3",
|
|
606
|
+
name: "Grok 3",
|
|
607
|
+
category: ["quality"],
|
|
608
|
+
contextLength: 131072,
|
|
609
|
+
bestFor: "Strong reasoning, real-time data",
|
|
610
|
+
},
|
|
611
|
+
// Mistral
|
|
612
|
+
{
|
|
613
|
+
id: "mistralai/mistral-large-2411",
|
|
614
|
+
name: "Mistral Large",
|
|
615
|
+
category: ["quality", "code"],
|
|
616
|
+
contextLength: 131072,
|
|
617
|
+
bestFor: "Coding, reasoning, multilingual",
|
|
618
|
+
},
|
|
619
|
+
{
|
|
620
|
+
id: "mistralai/mistral-nemo",
|
|
621
|
+
name: "Mistral Nemo",
|
|
622
|
+
category: ["fast", "cheap"],
|
|
623
|
+
contextLength: 131072,
|
|
624
|
+
bestFor: "Ultra cheap, 131K context",
|
|
625
|
+
},
|
|
626
|
+
// DeepSeek
|
|
627
|
+
{
|
|
628
|
+
id: "deepseek/deepseek-r1",
|
|
629
|
+
name: "DeepSeek R1",
|
|
630
|
+
category: ["quality", "code"],
|
|
631
|
+
contextLength: 163000,
|
|
632
|
+
bestFor: "Excellent reasoning, chain-of-thought",
|
|
633
|
+
},
|
|
634
|
+
{
|
|
635
|
+
id: "deepseek/deepseek-v3.2",
|
|
636
|
+
name: "DeepSeek V3.2",
|
|
637
|
+
category: ["code", "cheap"],
|
|
638
|
+
contextLength: 163000,
|
|
639
|
+
bestFor: "Fast coding, affordable",
|
|
640
|
+
},
|
|
641
|
+
// Qwen
|
|
642
|
+
{
|
|
643
|
+
id: "qwen/qwen3-235b",
|
|
644
|
+
name: "Qwen3 235B",
|
|
645
|
+
category: ["quality"],
|
|
646
|
+
contextLength: 40000,
|
|
647
|
+
bestFor: "Strong multilingual, great value",
|
|
648
|
+
},
|
|
649
|
+
];
|
|
650
|
+
let models = allModels;
|
|
651
|
+
if (category && category !== "all") {
|
|
652
|
+
models = allModels.filter((m) => m.category.includes(category));
|
|
653
|
+
}
|
|
654
|
+
return createJsonResponse({
|
|
655
|
+
category,
|
|
656
|
+
count: models.length,
|
|
657
|
+
models,
|
|
658
|
+
recommendation: category === "all"
|
|
659
|
+
? "Start with claude-3.5-haiku or gpt-4o-mini for most tasks. Use claude-sonnet-4.5 or deepseek-r1 for complex reasoning."
|
|
660
|
+
: undefined,
|
|
661
|
+
});
|
|
662
|
+
});
|
|
663
|
+
}
|
|
664
|
+
//# sourceMappingURL=openrouter.tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openrouter.tools.js","sourceRoot":"","sources":["../../src/tools/openrouter.tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.tools.d.ts","sourceRoot":"","sources":["../../src/tools/query.tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOpE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6O1D"}
|