@aeye/openrouter 0.4.1 → 0.7.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 +652 -556
- package/aeye-openrouter.md +39 -21
- package/dist/__integration__/openrouter.integration.test.js +6 -6
- package/dist/__integration__/openrouter.integration.test.js.map +1 -1
- package/dist/__tests__/batch.test.d.ts +5 -0
- package/dist/__tests__/batch.test.d.ts.map +1 -0
- package/dist/__tests__/batch.test.js +41 -0
- package/dist/__tests__/batch.test.js.map +1 -0
- package/dist/__tests__/features.test.d.ts +5 -0
- package/dist/__tests__/features.test.d.ts.map +1 -0
- package/dist/__tests__/features.test.js +206 -0
- package/dist/__tests__/features.test.js.map +1 -0
- package/dist/__tests__/openrouter.test.js +38 -1
- package/dist/__tests__/openrouter.test.js.map +1 -1
- package/dist/__tests__/rerank-decide.test.d.ts +5 -0
- package/dist/__tests__/rerank-decide.test.d.ts.map +1 -0
- package/dist/__tests__/rerank-decide.test.js +75 -0
- package/dist/__tests__/rerank-decide.test.js.map +1 -0
- package/dist/__tests__/schema-rejection.test.d.ts +6 -0
- package/dist/__tests__/schema-rejection.test.d.ts.map +1 -0
- package/dist/__tests__/schema-rejection.test.js +39 -0
- package/dist/__tests__/schema-rejection.test.js.map +1 -0
- package/dist/openrouter.d.ts +100 -41
- package/dist/openrouter.d.ts.map +1 -1
- package/dist/openrouter.js +390 -211
- package/dist/openrouter.js.map +1 -1
- package/dist/source.d.ts +9 -4
- package/dist/source.d.ts.map +1 -1
- package/dist/source.js +45 -28
- package/dist/source.js.map +1 -1
- package/dist/types.d.ts +244 -81
- package/dist/types.d.ts.map +1 -1
- package/package.json +6 -6
package/aeye-openrouter.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @aeye/openrouter
|
|
2
2
|
|
|
3
|
-
One-line purpose: OpenRouter provider for `@aeye/ai` — one API key, hundreds of models from many upstream providers (OpenAI, Anthropic, Google, Meta, Mistral, …) with provider routing,
|
|
3
|
+
One-line purpose: OpenRouter provider for `@aeye/ai` — one API key, hundreds of models from many upstream providers (OpenAI, Anthropic, Google, xAI, Meta, Mistral, …) with provider routing, fallback models, plugins, server tools, ZDR, reasoning, media endpoints, and real cost reporting. Built as a subclass of `@aeye/openai`'s `OpenAIProvider`.
|
|
4
4
|
|
|
5
5
|
## When to use
|
|
6
6
|
|
|
@@ -8,7 +8,7 @@ One-line purpose: OpenRouter provider for `@aeye/ai` — one API key, hundreds o
|
|
|
8
8
|
- You need routing control (preferred providers, fallbacks, price/throughput/latency sorting) or Zero Data Retention.
|
|
9
9
|
- You want a dynamic model registry with pricing/capabilities pulled from OpenRouter.
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
It also serves image generation/editing (through chat with the image modality), speech, transcription, and embeddings (through OpenRouter's OpenAI-compatible endpoints). Image and transcription streaming are not offered; those fall back to the non-streaming methods.
|
|
12
12
|
|
|
13
13
|
## Install / import
|
|
14
14
|
|
|
@@ -16,7 +16,7 @@ Do **not** use it for image generation, image editing, transcription, speech, or
|
|
|
16
16
|
npm install @aeye/openrouter
|
|
17
17
|
```
|
|
18
18
|
|
|
19
|
-
`@aeye/openai`, `@aeye/ai`, `@aeye/core`, and `openai` ship as dependencies.
|
|
19
|
+
`@aeye/openai`, `@aeye/ai`, `@aeye/core`, and `openai` (v7) ship as dependencies. Requires Node >= 22.
|
|
20
20
|
|
|
21
21
|
```typescript
|
|
22
22
|
import {
|
|
@@ -27,6 +27,7 @@ import {
|
|
|
27
27
|
type OpenRouterSourceConfig,
|
|
28
28
|
fetchModels,
|
|
29
29
|
fetchZDRModels,
|
|
30
|
+
fetchEndpointMetrics,
|
|
30
31
|
convertOpenRouterModel,
|
|
31
32
|
} from '@aeye/openrouter';
|
|
32
33
|
```
|
|
@@ -48,12 +49,12 @@ const ai = AI.with().providers({ openrouter }).create({ /* ... */ });
|
|
|
48
49
|
// Model ids use provider/model form
|
|
49
50
|
await ai.chat.get(
|
|
50
51
|
{ messages: [{ role: 'user', content: 'Hi' }] },
|
|
51
|
-
{ metadata: { model: 'anthropic/claude-
|
|
52
|
+
{ metadata: { model: 'anthropic/claude-sonnet-4.5' } }
|
|
52
53
|
);
|
|
53
54
|
|
|
54
55
|
await ai.chat.get(
|
|
55
56
|
{ messages: [{ role: 'user', content: 'Hi' }] },
|
|
56
|
-
{ metadata: { model: 'google/gemini-2.
|
|
57
|
+
{ metadata: { model: 'google/gemini-2.5-flash' } }
|
|
57
58
|
);
|
|
58
59
|
```
|
|
59
60
|
|
|
@@ -66,7 +67,7 @@ await ai.chat.get(
|
|
|
66
67
|
|
|
67
68
|
## Configuration (`OpenRouterConfig`)
|
|
68
69
|
|
|
69
|
-
`OpenRouterConfig extends OpenAIConfig
|
|
70
|
+
`OpenRouterConfig extends Omit<OpenAIConfig, 'api'>`, so the OpenAI fields apply (`apiKey`, `baseURL`, `organization`, `project`, `store`, `retry`, `retryEvents`, `hooks`, `defaultModels`) except `api`: requests always go through Chat Completions. It adds `defaultParams`:
|
|
70
71
|
|
|
71
72
|
```typescript
|
|
72
73
|
const openrouter = new OpenRouterProvider({
|
|
@@ -80,18 +81,22 @@ const openrouter = new OpenRouterProvider({
|
|
|
80
81
|
requireParameters: false, // -> require_parameters
|
|
81
82
|
dataCollection: 'deny', // 'deny' | 'allow' -> data_collection
|
|
82
83
|
zdr: true, // zero data retention
|
|
84
|
+
enforceDistillableText: false, // -> enforce_distillable_text
|
|
83
85
|
only: ['Anthropic'], // whitelist upstreams
|
|
84
86
|
ignore: ['Together'], // blacklist upstreams
|
|
85
|
-
quantizations: ['bf16', 'fp16'], // int4|int8|fp4|fp6|fp8|fp16|bf16|fp32|unknown
|
|
86
|
-
sort: 'price', // 'price' | 'throughput' | 'latency'
|
|
87
|
-
|
|
87
|
+
quantizations: ['bf16', 'fp16'], // int4|int8|fp4|mxfp4|nvfp4|fp6|fp8|mxfp8|fp16|bf16|fp32|unknown
|
|
88
|
+
sort: 'price', // 'price' | 'throughput' | 'latency' | 'exacto', or { by, partition: 'model' | 'none' }
|
|
89
|
+
preferredMinThroughput: 50, // -> preferred_min_throughput (tokens/s, median)
|
|
90
|
+
preferredMaxLatency: 2, // -> preferred_max_latency (seconds, median)
|
|
91
|
+
maxPrice: { prompt: 10, completion: 30, image: 0 }, // $/M tokens (image: $/image); also audio, request
|
|
88
92
|
},
|
|
89
|
-
|
|
93
|
+
fallbackModels: ['openai/gpt-5.4-mini'], // -> models
|
|
94
|
+
plugins: [{ id: 'response-healing' }], // file-parser | response-healing | context-compression
|
|
90
95
|
},
|
|
91
96
|
});
|
|
92
97
|
```
|
|
93
98
|
|
|
94
|
-
`defaultParams.providers` is mapped onto OpenRouter's `provider` request object (camelCase → snake_case is handled internally).
|
|
99
|
+
`defaultParams.providers` is mapped onto OpenRouter's `provider` request object (camelCase → snake_case is handled internally). `transforms` is deprecated: `transforms: ['middle-out']` is sent as the `context-compression` plugin. `requireParameters` left undefined is switched on automatically for strict `json_schema` requests.
|
|
95
100
|
|
|
96
101
|
## Provider routing
|
|
97
102
|
|
|
@@ -110,11 +115,22 @@ const openrouter = new OpenRouterProvider({
|
|
|
110
115
|
|
|
111
116
|
## Reasoning
|
|
112
117
|
|
|
113
|
-
If a request sets `request.reason`, the provider emits OpenRouter's `reasoning` object
|
|
118
|
+
If a request sets `request.reason`, the provider emits OpenRouter's `reasoning` object: `enabled: true`, either `max_tokens` (from `maxTokens`) or `effort` (clamped to the model's `reasoningEfforts`), never both, plus `exclude`, `summary`, `mode`, and `context`. No separate `reasoning_effort` is sent. Reasoning text and `reasoning_details` are parsed back onto `response.reasoning` (and streamed via chunks) with `provider: 'openrouter'`, and replayed on the same assistant message on later turns. Reasoning that names another provider (OpenAI directly, Bedrock) is not replayed.
|
|
119
|
+
|
|
120
|
+
## Server tools and other request features
|
|
121
|
+
|
|
122
|
+
- `hostedTools` run as OpenRouter server tools through chat: `web_search` → `openrouter:web_search` (`maxResults`, `allowedDomains`, `blockedDomains` → `excluded_domains`), `web_fetch` → `openrouter:web_fetch`, `image_generation` → `openrouter:image_generation`. `file_search`, `code_interpreter`, and `mcp` throw `ProviderError`. Calls are counted in `usage.tools`.
|
|
123
|
+
- `cacheBreakpoint` on content goes as `cache_control: { type: 'ephemeral' }`.
|
|
124
|
+
- `modalities` with `'image'` is passed through; images come back on `response.images` (streamed or not).
|
|
125
|
+
- `userKey` goes as `user`. `moderate` is not sent (OpenRouter ignores OpenAI's inline moderation).
|
|
126
|
+
- A strict tool adds the `x-anthropic-beta: structured-outputs-2025-11-13` header (via `chatHeaders`), without which OpenRouter strips `strict` from tools bound for Anthropic.
|
|
127
|
+
- A JSON or schema response format adds a `Respond in JSON.` system message when no message mentions JSON (Alibaba's Qwen rejects JSON mode otherwise).
|
|
128
|
+
- Assistant turns of only tool calls are sent with no content (Qwen's upstream rejects empty text).
|
|
129
|
+
- `rerank` (`/rerank`) and `decide` (alpha decisions endpoint, System One shape) run through `hooks.rerank` / `hooks.decide`. Batches go inline to `/batches`; the whole batch's cost comes back as `job.cost` (results carry token counts only).
|
|
114
130
|
|
|
115
131
|
## Dynamic model registry (`OpenRouterModelSource`)
|
|
116
132
|
|
|
117
|
-
Use OpenRouter as a `ModelSource` to populate the registry with live pricing, capabilities, context windows, and ZDR flags:
|
|
133
|
+
Use OpenRouter as a `ModelSource` to populate the registry with live pricing, capabilities, context windows, and ZDR flags. It lists every output modality (chat, image, speech, transcription, and embedding models); capabilities come from each modality (`vision`, `files`, `videoInput`, `hearing`, `image`, `audio`, `embedding`); pricing covers cache read/write, audio, image tokens, and web search per call; `reasoningEfforts` and `retiresAt` (from `expiration_date`) are filled in:
|
|
118
134
|
|
|
119
135
|
```typescript
|
|
120
136
|
import { OpenRouterModelSource } from '@aeye/openrouter';
|
|
@@ -133,13 +149,15 @@ const ai = AI.with()
|
|
|
133
149
|
await ai.models.refresh();
|
|
134
150
|
```
|
|
135
151
|
|
|
136
|
-
`fetchModels(apiKey?)` and `
|
|
152
|
+
`fetchModels(apiKey?)`, `fetchZDRModels(apiKey?)`, and `fetchEndpointMetrics(modelId, apiKey?)` (best median latency in ms, throughput in tokens/s, and uptime across a model's providers) are exported for direct use.
|
|
137
153
|
|
|
138
154
|
## Supported capabilities
|
|
139
155
|
|
|
140
|
-
Capabilities depend on the selected model, but the provider class supports: **chat, streaming, tools, structured output / JSON mode, reasoning, vision** (per model). Capabilities are auto-detected from each model's input/output modalities and `supported_parameters` during model conversion.
|
|
156
|
+
Capabilities depend on the selected model, but the provider class supports: **chat, streaming, tools, hosted (server) tools, structured output / JSON mode, reasoning, vision, files, video input, image generation and editing, audio output, speech, transcription, embeddings** (per model). Capabilities are auto-detected from each model's input/output modalities and `supported_parameters` during model conversion.
|
|
157
|
+
|
|
158
|
+
Default models: `google/gemini-2.5-flash-image` (image generate/edit), `openai/gpt-5.4-mini` (image analysis), `openai/gpt-transcribe`, `openai/text-embedding-3-small`, `cohere/rerank-v3.5` (rerank), `typesafe/jev-1.14` (decision); speech and chat have none.
|
|
141
159
|
|
|
142
|
-
|
|
160
|
+
Not offered (overridden to `undefined`, so the non-streaming method is used): image generation streaming, image edit streaming, transcription streaming.
|
|
143
161
|
|
|
144
162
|
## Cost tracking
|
|
145
163
|
|
|
@@ -147,15 +165,15 @@ OpenRouter returns actual spend, surfaced on usage:
|
|
|
147
165
|
|
|
148
166
|
```typescript
|
|
149
167
|
const response = await ai.chat.get({ messages });
|
|
150
|
-
console.log(response.usage?.cost); // real cost reported by OpenRouter
|
|
168
|
+
console.log(response.usage?.cost); // real cost reported by OpenRouter, including the upstream bill for BYOK requests
|
|
151
169
|
```
|
|
152
170
|
|
|
153
171
|
(Available on both non-streaming responses and streamed usage chunks.)
|
|
154
172
|
|
|
155
173
|
## Gotchas
|
|
156
174
|
|
|
157
|
-
- **
|
|
158
|
-
- Model ids are `provider/model` slugs (e.g. `anthropic/claude-
|
|
159
|
-
- Strict/structured output behavior is inherited from `OpenAIProvider` (best-effort, silent
|
|
160
|
-
- Assistant reasoning
|
|
175
|
+
- **Images go through chat.** `generateImage` / `editImage` send a chat request with `modalities: ['image', 'text']` (running through the chat hooks); `size` becomes an `image_config.aspect_ratio`, and an edit's `image` + `references` are sent as input images. GPT Image options such as `quality` and `outputFormat` are not sent.
|
|
176
|
+
- Model ids are `provider/model` slugs (e.g. `anthropic/claude-sonnet-4.5`), not raw OpenAI ids.
|
|
177
|
+
- Strict/structured output behavior is inherited from `OpenAIProvider` (best-effort, silent fallback to the family's non-strict descriptor), but the accepted dialects are widened here: `supportedStrictFamilies = {'openai', 'anthropic', 'google', 'xai'}`, because the model id's `family/…` prefix names the upstream that actually serves the request. This applies to **tool** schemas as well as `response_format`; before 0.4.x the inherited `{'openai'}` quietly forced every non-OpenAI model's tools through LENIENT.
|
|
178
|
+
- Assistant reasoning rides on its own assistant message (with that turn's text and tool calls), once even when the message is split into parts; it is not split into a separate message.
|
|
161
179
|
- ZDR (`zdr: true` / `dataCollection: 'deny'`) only constrains upstreams that honor it; combine with `only`/`ignore` for strict guarantees.
|
|
@@ -60,7 +60,7 @@ describeIntegration('OpenRouter Integration', () => {
|
|
|
60
60
|
]
|
|
61
61
|
};
|
|
62
62
|
// Use a free model to avoid charges
|
|
63
|
-
const response = await executor(request, {}, { model: 'google/gemini-flash-
|
|
63
|
+
const response = await executor(request, {}, { model: 'google/gemini-2.5-flash-lite' });
|
|
64
64
|
expect(response.content).toBeTruthy();
|
|
65
65
|
expect(typeof response.content).toBe('string');
|
|
66
66
|
expect(response.finishReason).toBeTruthy();
|
|
@@ -81,7 +81,7 @@ describeIntegration('OpenRouter Integration', () => {
|
|
|
81
81
|
};
|
|
82
82
|
const chunks = [];
|
|
83
83
|
let finalUsage = null;
|
|
84
|
-
for await (const chunk of streamer(request, {}, { model: 'google/gemini-flash-
|
|
84
|
+
for await (const chunk of streamer(request, {}, { model: 'google/gemini-2.5-flash-lite' })) {
|
|
85
85
|
if (chunk.content) {
|
|
86
86
|
chunks.push(chunk.content);
|
|
87
87
|
}
|
|
@@ -106,7 +106,7 @@ describeIntegration('OpenRouter Integration', () => {
|
|
|
106
106
|
};
|
|
107
107
|
const ctx = {
|
|
108
108
|
metadata: {
|
|
109
|
-
model: 'google/gemini-flash-
|
|
109
|
+
model: 'google/gemini-2.5-flash-lite'
|
|
110
110
|
}
|
|
111
111
|
};
|
|
112
112
|
const response = await executor(request, ctx, {});
|
|
@@ -118,8 +118,8 @@ describeIntegration('OpenRouter Integration', () => {
|
|
|
118
118
|
const executor = provider.createExecutor();
|
|
119
119
|
// Test models from different providers available on OpenRouter
|
|
120
120
|
const testModels = [
|
|
121
|
-
'google/gemini-flash-
|
|
122
|
-
'
|
|
121
|
+
'google/gemini-2.5-flash-lite',
|
|
122
|
+
'openai/gpt-5.4-nano'
|
|
123
123
|
];
|
|
124
124
|
for (const model of testModels) {
|
|
125
125
|
try {
|
|
@@ -172,7 +172,7 @@ describeIntegration('OpenRouter Integration', () => {
|
|
|
172
172
|
messages: [{ role: 'user', content: 'Hi' }]
|
|
173
173
|
};
|
|
174
174
|
// Make multiple rapid requests using free model
|
|
175
|
-
const promises = Array(3).fill(null).map(() => executor(request, {}, { model: 'google/gemini-flash-
|
|
175
|
+
const promises = Array(3).fill(null).map(() => executor(request, {}, { model: 'google/gemini-2.5-flash-lite' }));
|
|
176
176
|
// At least some should succeed
|
|
177
177
|
const results = await Promise.allSettled(promises);
|
|
178
178
|
const succeeded = results.filter(r => r.status === 'fulfilled').length;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openrouter.integration.test.js","sourceRoot":"","sources":["../../src/__integration__/openrouter.integration.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"openrouter.integration.test.js","sourceRoot":"","sources":["../../src/__integration__/openrouter.integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/batch.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenRouter batches: requests and results go inline.
|
|
3
|
+
*/
|
|
4
|
+
import { AI } from '@aeye/ai';
|
|
5
|
+
import { OpenRouterProvider } from '../openrouter';
|
|
6
|
+
const mockPost = jest.fn();
|
|
7
|
+
const mockGet = jest.fn();
|
|
8
|
+
jest.mock('openai', () => jest.fn().mockImplementation(() => ({ post: mockPost, get: mockGet })));
|
|
9
|
+
const ctx = { ai: AI.with().providers({}).create({}), metadata: { model: 'anthropic/claude-haiku-4.5' } };
|
|
10
|
+
const provider = new OpenRouterProvider({ apiKey: 'k' });
|
|
11
|
+
const counts = { total: 2, completed: 2, failed: 0 };
|
|
12
|
+
beforeEach(() => jest.clearAllMocks());
|
|
13
|
+
describe('batch', () => {
|
|
14
|
+
it('posts the requests inline', async () => {
|
|
15
|
+
mockPost.mockResolvedValue({ id: 'batch_1', status: 'validating', request_counts: { total: 2, completed: 0, failed: 0 }, error: null, results: null });
|
|
16
|
+
const job = await provider.submitBatch([
|
|
17
|
+
{ messages: [{ role: 'user', content: 'One' }] },
|
|
18
|
+
{ messages: [{ role: 'user', content: 'Two' }], reason: { effort: 'low' } },
|
|
19
|
+
], ctx);
|
|
20
|
+
const [path, { body }] = mockPost.mock.calls[0];
|
|
21
|
+
expect(path).toBe('/batches');
|
|
22
|
+
expect(body).toMatchObject({ endpoint: '/v1/chat/completions', model: 'anthropic/claude-haiku-4.5' });
|
|
23
|
+
expect(body.requests.map((r) => r.custom_id)).toEqual(['0', '1']);
|
|
24
|
+
expect(body.requests[1].body.reasoning).toEqual({ enabled: true, effort: 'low' });
|
|
25
|
+
expect(job).toMatchObject({ id: 'batch_1', provider: 'openrouter', status: 'validating' });
|
|
26
|
+
});
|
|
27
|
+
it('reads inline results, cost included', async () => {
|
|
28
|
+
const body = (content) => ({ object: 'chat.completion', choices: [{ message: { content }, finish_reason: 'stop' }], usage: { prompt_tokens: 4, completion_tokens: 1, total_tokens: 5, cost: 0.0001 } });
|
|
29
|
+
mockGet.mockResolvedValue({
|
|
30
|
+
id: 'batch_1', status: 'completed', request_counts: counts, error: null,
|
|
31
|
+
usage: { prompt_tokens: 8, completion_tokens: 2, total_tokens: 10, cost: 0, is_byok: true, cost_details: { upstream_inference_cost: 0.00004 } },
|
|
32
|
+
results: [{ custom_id: '1', response: { status_code: 200, body: body('second') } }, { custom_id: '0', response: { status_code: 200, body: body('first') } }],
|
|
33
|
+
});
|
|
34
|
+
const job = await provider.getBatch({ id: 'batch_1', provider: 'openrouter', model: 'anthropic/claude-haiku-4.5', status: 'in_progress' }, ctx);
|
|
35
|
+
expect(mockGet.mock.calls[0][0]).toBe('/batches/batch_1');
|
|
36
|
+
expect(job.results?.map(r => r.response?.content)).toEqual(['first', 'second']);
|
|
37
|
+
expect(job.results?.[0].response?.usage?.cost).toBe(0.0001);
|
|
38
|
+
expect(job.cost).toBe(0.00004);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
//# sourceMappingURL=batch.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch.test.js","sourceRoot":"","sources":["../../src/__tests__/batch.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/features.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenRouter request features, response extras, and model conversion.
|
|
3
|
+
*/
|
|
4
|
+
import { AI } from '@aeye/ai';
|
|
5
|
+
import { accumulateReasoning, TEXT_TOOL_SCHEMA } from '@aeye/core';
|
|
6
|
+
import { convertOpenRouterModel, OpenRouterProvider } from '../openrouter';
|
|
7
|
+
const mockCreate = jest.fn();
|
|
8
|
+
jest.mock('openai', () => jest.fn().mockImplementation(() => ({
|
|
9
|
+
chat: { completions: { create: mockCreate } },
|
|
10
|
+
})));
|
|
11
|
+
const ctx = { ai: AI.with().providers({}).create({}), metadata: {} };
|
|
12
|
+
const hi = { messages: [{ role: 'user', content: 'Hi' }] };
|
|
13
|
+
const completion = (message, usage) => ({
|
|
14
|
+
id: 'gen-1',
|
|
15
|
+
choices: [{ message: { role: 'assistant', content: 'ok', ...message }, finish_reason: 'stop' }],
|
|
16
|
+
usage,
|
|
17
|
+
});
|
|
18
|
+
const sentParams = () => mockCreate.mock.calls[mockCreate.mock.calls.length - 1][0];
|
|
19
|
+
beforeEach(() => mockCreate.mockReset().mockResolvedValue(completion({})));
|
|
20
|
+
describe('request', () => {
|
|
21
|
+
it('sends reasoning as one object with a budget or an effort, never both', async () => {
|
|
22
|
+
await new OpenRouterProvider({ apiKey: 'k' }).createExecutor()({ ...hi, reason: { effort: 'high', exclude: true, maxTokens: 2000 } }, ctx, { model: 'openai/gpt-5.4' });
|
|
23
|
+
expect(sentParams().reasoning).toEqual({ enabled: true, max_tokens: 2000, exclude: true });
|
|
24
|
+
expect(sentParams()).not.toHaveProperty('reasoning_effort');
|
|
25
|
+
await new OpenRouterProvider({ apiKey: 'k' }).createExecutor()({ ...hi, reason: { effort: 'high' } }, ctx, { model: 'openai/gpt-5.4' });
|
|
26
|
+
expect(sentParams().reasoning).toEqual({ enabled: true, effort: 'high' });
|
|
27
|
+
});
|
|
28
|
+
it('maps routing, fallbacks, plugins, and the deprecated middle-out transform', async () => {
|
|
29
|
+
const provider = new OpenRouterProvider({
|
|
30
|
+
apiKey: 'k',
|
|
31
|
+
defaultParams: {
|
|
32
|
+
providers: { sort: { by: 'throughput', partition: 'none' }, preferredMaxLatency: 2, enforceDistillableText: true },
|
|
33
|
+
fallbackModels: ['anthropic/claude-sonnet-5'],
|
|
34
|
+
plugins: [{ id: 'response-healing' }],
|
|
35
|
+
transforms: ['middle-out'],
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
await provider.createExecutor()({ ...hi, userKey: 'user-1' }, ctx, { model: 'openai/gpt-5.4' });
|
|
39
|
+
expect(sentParams()).toMatchObject({
|
|
40
|
+
provider: { sort: { by: 'throughput', partition: 'none' }, preferred_max_latency: 2, enforce_distillable_text: true },
|
|
41
|
+
models: ['anthropic/claude-sonnet-5'],
|
|
42
|
+
plugins: [{ id: 'response-healing' }, { id: 'context-compression', engine: 'middle-out' }],
|
|
43
|
+
user: 'user-1',
|
|
44
|
+
});
|
|
45
|
+
expect(sentParams()).not.toHaveProperty('transforms');
|
|
46
|
+
});
|
|
47
|
+
it('runs hosted tools as OpenRouter server tools through chat', async () => {
|
|
48
|
+
await new OpenRouterProvider({ apiKey: 'k' }).createExecutor()({
|
|
49
|
+
...hi,
|
|
50
|
+
hostedTools: [{ type: 'web_search', maxResults: 3, allowedDomains: ['github.com'] }, { type: 'web_fetch' }],
|
|
51
|
+
}, ctx, { model: 'openai/gpt-5.4' });
|
|
52
|
+
expect(sentParams().tools).toEqual([
|
|
53
|
+
{ type: 'openrouter:web_search', parameters: { max_results: 3, allowed_domains: ['github.com'], excluded_domains: undefined } },
|
|
54
|
+
{ type: 'openrouter:web_fetch' },
|
|
55
|
+
]);
|
|
56
|
+
});
|
|
57
|
+
it('sends only the allowed tools, since OpenRouter ignores allowed_tools', async () => {
|
|
58
|
+
const tool = (name) => ({ name, parameters: TEXT_TOOL_SCHEMA });
|
|
59
|
+
await new OpenRouterProvider({ apiKey: 'k' }).createExecutor()({
|
|
60
|
+
...hi,
|
|
61
|
+
tools: [tool('weather'), tool('news')],
|
|
62
|
+
toolChoice: { allowed: ['news'], required: true },
|
|
63
|
+
}, ctx, { model: 'anthropic/claude-haiku-4.5' });
|
|
64
|
+
expect(sentParams().tools.map((t) => t.function.name)).toEqual(['news']);
|
|
65
|
+
expect(sentParams().tool_choice).toBe('required');
|
|
66
|
+
});
|
|
67
|
+
it('marks cache breakpoints with cache_control', async () => {
|
|
68
|
+
await new OpenRouterProvider({ apiKey: 'k' }).createExecutor()({
|
|
69
|
+
messages: [{ role: 'user', content: [{ type: 'text', content: 'Shared prefix', cacheBreakpoint: true }] }],
|
|
70
|
+
}, ctx, { model: 'anthropic/claude-sonnet-5' });
|
|
71
|
+
expect(sentParams().messages[0].content[0]).toEqual({ type: 'text', text: 'Shared prefix', cache_control: { type: 'ephemeral' } });
|
|
72
|
+
});
|
|
73
|
+
it('replays reasoning on its own turn, with no empty text beside tool calls', async () => {
|
|
74
|
+
// As captured from anthropic/claude-haiku-4.5: Anthropic checks the signature, and
|
|
75
|
+
// upstreams such as Qwen's reject an empty text part
|
|
76
|
+
const details = [{ type: 'reasoning.text', text: 'Roll first.', signature: 'sig', format: 'anthropic-claude-v1', index: 0 }];
|
|
77
|
+
const call = { id: 'toolu_1', name: 'roll_dice', arguments: '{"count":4}' };
|
|
78
|
+
await new OpenRouterProvider({ apiKey: 'k' }).createExecutor()({
|
|
79
|
+
messages: [
|
|
80
|
+
{ role: 'user', content: 'Q' },
|
|
81
|
+
{ role: 'assistant', content: 'A', reasoning: { content: 'Thinking', details, provider: 'openrouter' } },
|
|
82
|
+
{ role: 'user', content: 'Q2' },
|
|
83
|
+
{ role: 'assistant', content: '', toolCalls: [call], reasoning: { content: 'Roll first.', details } },
|
|
84
|
+
{ role: 'tool', toolCallId: 'toolu_1', content: '7' },
|
|
85
|
+
],
|
|
86
|
+
}, ctx, { model: 'anthropic/claude-sonnet-5' });
|
|
87
|
+
const [, answer, , roll] = sentParams().messages;
|
|
88
|
+
expect(answer).toMatchObject({ role: 'assistant', content: [{ type: 'text', text: 'A' }], reasoning: 'Thinking', reasoning_details: details });
|
|
89
|
+
expect(roll).toEqual({
|
|
90
|
+
role: 'assistant',
|
|
91
|
+
content: null,
|
|
92
|
+
tool_calls: [{ id: 'toolu_1', type: 'function', function: { name: 'roll_dice', arguments: '{"count":4}' } }],
|
|
93
|
+
reasoning: 'Roll first.',
|
|
94
|
+
reasoning_details: details,
|
|
95
|
+
});
|
|
96
|
+
expect(sentParams().messages).toHaveLength(5);
|
|
97
|
+
});
|
|
98
|
+
it('replays only reasoning OpenRouter produced', async () => {
|
|
99
|
+
// As captured from OpenAI gpt-5.4-nano directly: encrypted for another account
|
|
100
|
+
const details = [{ id: 'rs_1', type: 'reasoning.encrypted', format: 'openai-responses-v1', data: 'ENC' }];
|
|
101
|
+
await new OpenRouterProvider({ apiKey: 'k' }).createExecutor()({
|
|
102
|
+
messages: [
|
|
103
|
+
{ role: 'user', content: 'Q' },
|
|
104
|
+
{ role: 'assistant', content: 'A', reasoning: { details, provider: 'openai' } },
|
|
105
|
+
{ role: 'user', content: 'Q2' },
|
|
106
|
+
],
|
|
107
|
+
}, ctx, { model: 'openai/gpt-5.4-mini' });
|
|
108
|
+
expect(sentParams().messages[1]).not.toHaveProperty('reasoning_details');
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
describe('response', () => {
|
|
112
|
+
it('counts tokens once, adds the BYOK upstream bill, and counts server tools', async () => {
|
|
113
|
+
mockCreate.mockResolvedValue(completion({}, {
|
|
114
|
+
prompt_tokens: 100,
|
|
115
|
+
completion_tokens: 40,
|
|
116
|
+
total_tokens: 140,
|
|
117
|
+
prompt_tokens_details: { cached_tokens: 30 },
|
|
118
|
+
completion_tokens_details: { reasoning_tokens: 25 },
|
|
119
|
+
cost: 0.001,
|
|
120
|
+
is_byok: true,
|
|
121
|
+
cost_details: { upstream_inference_cost: 0.02 },
|
|
122
|
+
server_tool_use_details: { web_search_requests: 2 },
|
|
123
|
+
}));
|
|
124
|
+
const response = await new OpenRouterProvider({ apiKey: 'k' }).createExecutor()(hi, ctx, { model: 'openai/gpt-5.4' });
|
|
125
|
+
expect(response.usage).toEqual({
|
|
126
|
+
text: { input: 70, output: 15, cached: 30 },
|
|
127
|
+
reasoning: { output: 25 },
|
|
128
|
+
tools: { web_search: 2 },
|
|
129
|
+
cost: 0.021,
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
it('streams reasoning deltas from both reasoning and reasoning_details', async () => {
|
|
133
|
+
// As measured from anthropic/claude-haiku-4.5 and google/gemini-3.5-flash:
|
|
134
|
+
// each delta once in both fields, the signature or encrypted payload last
|
|
135
|
+
const format = 'anthropic-claude-v1';
|
|
136
|
+
const deltas = ['Is 391', ' prime', '?', ' Try', ' the', ' primes', '.', '\n', '\n', ' 17', ' times', ' the', ' 23', '.'];
|
|
137
|
+
const chunk = (delta, finish_reason = null) => ({ id: 'gen-1', choices: [{ index: 0, delta, finish_reason }] });
|
|
138
|
+
mockCreate.mockResolvedValue((async function* () {
|
|
139
|
+
for (const text of deltas) {
|
|
140
|
+
yield chunk({ reasoning: text, reasoning_details: [{ type: 'reasoning.text', text, format, index: 0 }] });
|
|
141
|
+
}
|
|
142
|
+
yield chunk({ reasoning_details: [{ type: 'reasoning.text', signature: 'sig', format, index: 0 }] });
|
|
143
|
+
yield chunk({ reasoning: null, reasoning_details: [{ type: 'reasoning.encrypted', data: 'ENC', format, index: 0 }] });
|
|
144
|
+
yield chunk({ content: 'No.' }, 'stop');
|
|
145
|
+
})());
|
|
146
|
+
const stream = new OpenRouterProvider({ apiKey: 'k' }).createStreamer()(hi, ctx, { model: 'anthropic/claude-haiku-4.5' });
|
|
147
|
+
let partial;
|
|
148
|
+
let next = await stream.next();
|
|
149
|
+
for (; !next.done; next = await stream.next()) {
|
|
150
|
+
partial = accumulateReasoning(partial, next.value.reasoning);
|
|
151
|
+
}
|
|
152
|
+
const text = deltas.join('');
|
|
153
|
+
const reasoning = {
|
|
154
|
+
content: text,
|
|
155
|
+
details: [{ type: 'reasoning.text', text, signature: 'sig', format, index: 0 }, { type: 'reasoning.encrypted', data: 'ENC', format, index: 0 }],
|
|
156
|
+
provider: 'openrouter',
|
|
157
|
+
};
|
|
158
|
+
expect(partial).toEqual(reasoning);
|
|
159
|
+
expect(next.value.reasoning).toEqual(reasoning);
|
|
160
|
+
});
|
|
161
|
+
it('generates images through chat', async () => {
|
|
162
|
+
mockCreate.mockResolvedValue(completion({ images: [{ type: 'image_url', image_url: { url: 'data:image/png;base64,AAA' } }] }));
|
|
163
|
+
const response = await new OpenRouterProvider({ apiKey: 'k' }).generateImage({ prompt: 'A dot', size: '1600x900' }, ctx);
|
|
164
|
+
expect(sentParams()).toMatchObject({
|
|
165
|
+
model: 'google/gemini-2.5-flash-image',
|
|
166
|
+
modalities: ['image', 'text'],
|
|
167
|
+
image_config: { aspect_ratio: '16:9' },
|
|
168
|
+
});
|
|
169
|
+
expect(response.images).toEqual([{ url: 'data:image/png;base64,AAA' }]);
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
describe('convertOpenRouterModel', () => {
|
|
173
|
+
const model = {
|
|
174
|
+
id: 'openai/gpt-5.4-mini',
|
|
175
|
+
canonical_slug: 'openai/gpt-5.4-mini-20260317',
|
|
176
|
+
hugging_face_id: null,
|
|
177
|
+
name: 'OpenAI: GPT-5.4 Mini',
|
|
178
|
+
created: 1,
|
|
179
|
+
context_length: 400000,
|
|
180
|
+
architecture: { modality: 'text+image+file->text', input_modalities: ['text', 'image', 'file'], output_modalities: ['text'], tokenizer: 'GPT', instruct_type: null },
|
|
181
|
+
pricing: { prompt: '0.00000075', completion: '0.0000045', input_cache_read: '0.000000075', web_search: '0.01', internal_reasoning: '0' },
|
|
182
|
+
top_provider: { context_length: 400000, max_completion_tokens: 128000, is_moderated: true },
|
|
183
|
+
supported_parameters: ['tools', 'reasoning', 'response_format', 'structured_outputs', 'verbosity', 'seed'],
|
|
184
|
+
default_parameters: null,
|
|
185
|
+
reasoning: { supported_efforts: ['xhigh', 'high', 'medium', 'low', 'none'], default_effort: 'medium' },
|
|
186
|
+
expiration_date: '2027-03-01T00:00:00Z',
|
|
187
|
+
knowledge_cutoff: '2025-08-31',
|
|
188
|
+
};
|
|
189
|
+
it('maps capabilities, prices, efforts, and retirement', () => {
|
|
190
|
+
const info = convertOpenRouterModel(model, new Set([model.id]));
|
|
191
|
+
expect([...info.capabilities].sort()).toEqual(['chat', 'files', 'json', 'reasoning', 'streaming', 'structured', 'tools', 'vision', 'zdr']);
|
|
192
|
+
expect(info.pricing.text).toEqual({ input: 0.75, output: 4.5, cached: 0.075, cacheWrite: undefined });
|
|
193
|
+
expect(info.pricing.tools).toEqual({ web_search: 0.01 });
|
|
194
|
+
expect(info.pricing.reasoning).toBeUndefined();
|
|
195
|
+
expect(info.reasoningEfforts).toEqual(['none', 'low', 'medium', 'high', 'xhigh']);
|
|
196
|
+
expect(info.retiresAt).toBe('2027-03-01');
|
|
197
|
+
expect([...info.supportedParameters ?? []]).toEqual(expect.arrayContaining(['verbosity', 'seed']));
|
|
198
|
+
});
|
|
199
|
+
it('recognizes speech, transcription, and embedding models', () => {
|
|
200
|
+
const as = (modality) => convertOpenRouterModel({ ...model, architecture: modality, supported_parameters: [] }, new Set()).capabilities;
|
|
201
|
+
expect([...as({ ...model.architecture, input_modalities: ['text'], output_modalities: ['speech'] })]).toEqual(['audio']);
|
|
202
|
+
expect([...as({ ...model.architecture, input_modalities: ['audio'], output_modalities: ['transcription'] })]).toEqual(['hearing']);
|
|
203
|
+
expect([...as({ ...model.architecture, input_modalities: ['text'], output_modalities: ['embeddings'] })]).toEqual(['embedding']);
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
//# sourceMappingURL=features.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features.test.js","sourceRoot":"","sources":["../../src/__tests__/features.test.ts"],"names":[],"mappings":"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"}
|