@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.
Files changed (33) hide show
  1. package/README.md +652 -556
  2. package/aeye-openrouter.md +39 -21
  3. package/dist/__integration__/openrouter.integration.test.js +6 -6
  4. package/dist/__integration__/openrouter.integration.test.js.map +1 -1
  5. package/dist/__tests__/batch.test.d.ts +5 -0
  6. package/dist/__tests__/batch.test.d.ts.map +1 -0
  7. package/dist/__tests__/batch.test.js +41 -0
  8. package/dist/__tests__/batch.test.js.map +1 -0
  9. package/dist/__tests__/features.test.d.ts +5 -0
  10. package/dist/__tests__/features.test.d.ts.map +1 -0
  11. package/dist/__tests__/features.test.js +206 -0
  12. package/dist/__tests__/features.test.js.map +1 -0
  13. package/dist/__tests__/openrouter.test.js +38 -1
  14. package/dist/__tests__/openrouter.test.js.map +1 -1
  15. package/dist/__tests__/rerank-decide.test.d.ts +5 -0
  16. package/dist/__tests__/rerank-decide.test.d.ts.map +1 -0
  17. package/dist/__tests__/rerank-decide.test.js +75 -0
  18. package/dist/__tests__/rerank-decide.test.js.map +1 -0
  19. package/dist/__tests__/schema-rejection.test.d.ts +6 -0
  20. package/dist/__tests__/schema-rejection.test.d.ts.map +1 -0
  21. package/dist/__tests__/schema-rejection.test.js +39 -0
  22. package/dist/__tests__/schema-rejection.test.js.map +1 -0
  23. package/dist/openrouter.d.ts +100 -41
  24. package/dist/openrouter.d.ts.map +1 -1
  25. package/dist/openrouter.js +390 -211
  26. package/dist/openrouter.js.map +1 -1
  27. package/dist/source.d.ts +9 -4
  28. package/dist/source.d.ts.map +1 -1
  29. package/dist/source.js +45 -28
  30. package/dist/source.js.map +1 -1
  31. package/dist/types.d.ts +244 -81
  32. package/dist/types.d.ts.map +1 -1
  33. package/package.json +6 -6
@@ -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, fallbacks, ZDR, reasoning, and real cost reporting. Built as a subclass of `@aeye/openai`'s `OpenAIProvider`.
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
- Do **not** use it for image generation, image editing, transcription, speech, or embeddings — those operations are explicitly disabled (see Gotchas).
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-3.5-sonnet' } }
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.0-flash' } }
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`, so all OpenAI fields apply (`apiKey`, `baseURL`, `organization`, `project`, `store`, `retry`, `retryEvents`, `hooks`, `defaultModels`). It adds `defaultParams`:
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
- maxPrice: { prompt: 10, completion: 30, image: 0 }, // $/M tokens (image: $/image)
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
- transforms: ['middle-out'], // context transforms
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 (`enabled: true`, plus `effort` and `max_tokens`). Reasoning text and `reasoning_details` are parsed back onto `response.reasoning` (and streamed via chunks).
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 `fetchZDRModels(apiKey?)` are exported for direct use.
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
- Explicitly **unsupported** (overridden to `undefined`): image generation, image generation streaming, image editing, transcription, transcription streaming, speech, embeddings.
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
- - **Chat-only provider.** `generateImage`, `editImage`, `transcribe`, `speech`, and `embed` are set to `undefined` — calling those operations on this provider will not work; use OpenAI/AWS/Replicate for them.
158
- - Model ids are `provider/model` slugs (e.g. `anthropic/claude-3.5-sonnet`), not raw OpenAI ids.
159
- - Strict/structured output behavior is inherited from `OpenAIProvider` (best-effort, silent lenient fallback), but the accepted dialects are widened here: `supportedStrictFamilies = {'openai', 'anthropic', 'google'}`, 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.
160
- - Assistant reasoning is split into a separate preceding message during conversion to work around OpenRouter not round-tripping reasoning attached to content — expect an extra assistant message in transformed payloads.
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-1.5' });
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-1.5' })) {
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-1.5'
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-1.5',
122
- 'meta-llama/llama-3.2-3b-instruct:free'
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-1.5' }));
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,5 @@
1
+ /**
2
+ * OpenRouter batches: requests and results go inline.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=batch.test.d.ts.map
@@ -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":"AAAA;;GAEG;AAEH,OAAO,EAAE,EAAE,EAAqB,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;AAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;AAC1B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;AAElG,MAAM,GAAG,GAAiB,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,4BAA4B,EAAE,EAAE,CAAC;AACxH,MAAM,QAAQ,GAAG,IAAI,kBAAkB,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;AACzD,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AAErD,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;AAEvC,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACrB,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QACzC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAEvJ,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,WAAY,CAAC;YACtC,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE;YAChD,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;SAC5E,EAAE,GAAG,CAAC,CAAC;QAER,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,sBAAsB,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC,CAAC;QACtG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAwB,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QACzF,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAClF,MAAM,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;IAC7F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,IAAI,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QAChN,OAAO,CAAC,iBAAiB,CAAC;YACxB,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI;YACvE,KAAK,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,uBAAuB,EAAE,OAAO,EAAE,EAAE;YAC/I,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;SAC7J,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAS,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,4BAA4B,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,GAAG,CAAC,CAAC;QAEjJ,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC1D,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QAChF,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5D,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * OpenRouter request features, response extras, and model conversion.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=features.test.d.ts.map
@@ -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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"}