@namzu/openrouter 1.0.0 → 1.0.2
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/CHANGELOG.md +52 -0
- package/dist/__tests__/openrouter.test.js +5 -0
- package/dist/__tests__/openrouter.test.js.map +1 -1
- package/dist/client.d.ts +9 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +20 -1
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -7
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/openrouter.test.ts +6 -0
- package/src/client.ts +23 -1
- package/src/index.ts +3 -9
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,57 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.0.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- f1f000c: Declare honest driver capabilities on each provider instance.
|
|
8
|
+
|
|
9
|
+
Every shipped driver now exposes `readonly capabilities` (and
|
|
10
|
+
re-exports its `*_CAPABILITIES` constant from the client module)
|
|
11
|
+
describing what the DRIVER does — not what the vendor API could do —
|
|
12
|
+
so the SDK's capability negotiation can warn instead of silently
|
|
13
|
+
degrading:
|
|
14
|
+
|
|
15
|
+
- `@namzu/ollama`: `supportsTools: false`, `supportsVision: false`
|
|
16
|
+
(the driver never sends tool schemas and drops image attachments).
|
|
17
|
+
- `@namzu/lmstudio`: `supportsTools` corrected `true` → `false` and
|
|
18
|
+
`supportsFunctionCalling` `true` → `false` — the driver folds tool
|
|
19
|
+
messages into user text and never sends tool schemas;
|
|
20
|
+
`supportsVision: false`.
|
|
21
|
+
- `@namzu/anthropic`: full (`supportsVision: true` — image attachments
|
|
22
|
+
already mapped).
|
|
23
|
+
- `@namzu/bedrock`, `@namzu/openrouter`, `@namzu/http`: tools pass
|
|
24
|
+
through (`supportsTools: true`) but `supportsVision: false` until
|
|
25
|
+
their message translation maps attachments.
|
|
26
|
+
|
|
27
|
+
## 1.0.1
|
|
28
|
+
|
|
29
|
+
### Patch Changes
|
|
30
|
+
|
|
31
|
+
- 9df35d1: Make a Stop abort the IN-FLIGHT model turn, not only between turns.
|
|
32
|
+
|
|
33
|
+
`ChatCompletionParams` gains an optional `signal?: AbortSignal`. The query
|
|
34
|
+
runtime threads the run's abort signal into every provider call (the streaming
|
|
35
|
+
turn and the forced-final summary) and now drives the provider stream through a
|
|
36
|
+
MANUAL iterator that RACES each `next()` against the abort — so a cancellation
|
|
37
|
+
tears the turn down within a tick even if a transport buffers or ignores the
|
|
38
|
+
signal, with the abort propagating out of the generator so the run settles as
|
|
39
|
+
`cancelled`. The stream consumer cleans up on every exit (removes the abort
|
|
40
|
+
listener, calls `iterator.return()`), and the natural-completion break
|
|
41
|
+
re-checks the signal so a Stop that lands exactly as the turn finishes is
|
|
42
|
+
recorded as cancelled rather than a normal end-of-turn.
|
|
43
|
+
|
|
44
|
+
Every provider now honours the signal at the transport: Anthropic
|
|
45
|
+
(`messages.create({ signal })`), OpenAI (`create(..., { signal })`), Bedrock
|
|
46
|
+
(`send(..., { abortSignal })`), OpenRouter + HTTP (compose with the request
|
|
47
|
+
timeout via `AbortSignal.any`), Ollama (the returned iterator's `.abort()`),
|
|
48
|
+
and LM Studio (`respond(..., { signal })` → the SDK's websocket cancel) — each
|
|
49
|
+
plus a cheap per-chunk `signal.throwIfAborted()` for promptness.
|
|
50
|
+
|
|
51
|
+
Fully additive and inert when unset: a never-aborted signal is behaviourally
|
|
52
|
+
identical to omitting it, so existing callers and uncancelled runs are
|
|
53
|
+
byte-identical.
|
|
54
|
+
|
|
3
55
|
## 1.0.0
|
|
4
56
|
|
|
5
57
|
### Patch Changes
|
|
@@ -38,8 +38,13 @@ describe('@namzu/openrouter', () => {
|
|
|
38
38
|
supportsTools: true,
|
|
39
39
|
supportsStreaming: true,
|
|
40
40
|
supportsFunctionCalling: true,
|
|
41
|
+
supportsVision: false,
|
|
41
42
|
});
|
|
42
43
|
});
|
|
44
|
+
it('is exposed on the provider instance for runtime negotiation', () => {
|
|
45
|
+
const provider = new OpenRouterProvider({ apiKey: 'test-key' });
|
|
46
|
+
expect(provider.capabilities).toEqual(OPENROUTER_CAPABILITIES);
|
|
47
|
+
});
|
|
43
48
|
});
|
|
44
49
|
describe('ProviderRegistry.create({ type: "openrouter", ... })', () => {
|
|
45
50
|
it('narrows the config type via module augmentation and instantiates OpenRouterProvider', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openrouter.test.js","sourceRoot":"","sources":["../../src/__tests__/openrouter.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AACrE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACzD,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAE7F,6EAA6E;AAC7E,4EAA4E;AAC5E,8CAA8C;AAC9C,UAAU,CAAC,GAAG,EAAE;IACf,IAAI,gBAAgB,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,CAAC;QAChD,gBAAgB,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;IAC1C,CAAC;AACF,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IAClC,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACpD,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAC9D,kBAAkB,EAAE,CAAA;YACpB,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC7D,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;QAC7D,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;YAC1E,kBAAkB,EAAE,CAAA;YACpB,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAA;QACxE,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;YAClE,kBAAkB,EAAE,CAAA;YACpB,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;YACjE,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9D,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;YACvE,kBAAkB,EAAE,CAAA;YACpB,MAAM,IAAI,GAAG,gBAAgB,CAAC,eAAe,CAAC,YAAY,CAAC,CAAA;YAC3D,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAA;QAC9C,CAAC,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACxC,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YACjD,MAAM,CAAC,uBAAuB,CAAC,CAAC,OAAO,CAAC;gBACvC,aAAa,EAAE,IAAI;gBACnB,iBAAiB,EAAE,IAAI;gBACvB,uBAAuB,EAAE,IAAI;
|
|
1
|
+
{"version":3,"file":"openrouter.test.js","sourceRoot":"","sources":["../../src/__tests__/openrouter.test.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
CHANGED
|
@@ -1,8 +1,16 @@
|
|
|
1
|
-
import type { ChatCompletionParams, LLMProvider, ModelInfo, StreamChunk } from '@namzu/sdk';
|
|
1
|
+
import type { ChatCompletionParams, LLMProvider, ModelInfo, ProviderCapabilities, StreamChunk } from '@namzu/sdk';
|
|
2
2
|
import type { OpenRouterConfig } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* What this DRIVER does, not what OpenRouter could do: tools pass
|
|
5
|
+
* through to the request body, but user-message image `attachments`
|
|
6
|
+
* are not mapped into content parts — `supportsVision` stays false
|
|
7
|
+
* until the message translation handles them.
|
|
8
|
+
*/
|
|
9
|
+
export declare const OPENROUTER_CAPABILITIES: ProviderCapabilities;
|
|
3
10
|
export declare class OpenRouterProvider implements LLMProvider {
|
|
4
11
|
readonly id = "openrouter";
|
|
5
12
|
readonly name = "OpenRouter";
|
|
13
|
+
readonly capabilities: ProviderCapabilities;
|
|
6
14
|
private config;
|
|
7
15
|
private baseUrl;
|
|
8
16
|
constructor(config: OpenRouterConfig);
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,oBAAoB,EACpB,WAAW,EACX,SAAS,EACT,WAAW,EAGX,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAwClD,qBAAa,kBAAmB,YAAW,WAAW;IACrD,QAAQ,CAAC,EAAE,gBAAe;IAC1B,QAAQ,CAAC,IAAI,gBAAe;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,oBAAoB,EACpB,WAAW,EACX,SAAS,EACT,oBAAoB,EACpB,WAAW,EAGX,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAwClD;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,EAAE,oBAKrC,CAAA;AAED,qBAAa,kBAAmB,YAAW,WAAW;IACrD,QAAQ,CAAC,EAAE,gBAAe;IAC1B,QAAQ,CAAC,IAAI,gBAAe;IAC5B,QAAQ,CAAC,YAAY,uBAA0B;IAE/C,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,OAAO,CAAQ;gBAEX,MAAM,EAAE,gBAAgB;IAQpC,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,cAAc;IAwBtB,OAAO,CAAC,gBAAgB;IAqCjB,UAAU,CAAC,MAAM,EAAE,oBAAoB,GAAG,aAAa,CAAC,WAAW,CAAC;IAgGrE,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IA+BlC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAWrC"}
|
package/dist/client.js
CHANGED
|
@@ -22,9 +22,22 @@ function formatToolChoice(tc) {
|
|
|
22
22
|
return tc;
|
|
23
23
|
return tc;
|
|
24
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* What this DRIVER does, not what OpenRouter could do: tools pass
|
|
27
|
+
* through to the request body, but user-message image `attachments`
|
|
28
|
+
* are not mapped into content parts — `supportsVision` stays false
|
|
29
|
+
* until the message translation handles them.
|
|
30
|
+
*/
|
|
31
|
+
export const OPENROUTER_CAPABILITIES = {
|
|
32
|
+
supportsTools: true,
|
|
33
|
+
supportsStreaming: true,
|
|
34
|
+
supportsFunctionCalling: true,
|
|
35
|
+
supportsVision: false,
|
|
36
|
+
};
|
|
25
37
|
export class OpenRouterProvider {
|
|
26
38
|
id = 'openrouter';
|
|
27
39
|
name = 'OpenRouter';
|
|
40
|
+
capabilities = OPENROUTER_CAPABILITIES;
|
|
28
41
|
config;
|
|
29
42
|
baseUrl;
|
|
30
43
|
constructor(config) {
|
|
@@ -111,11 +124,16 @@ export class OpenRouterProvider {
|
|
|
111
124
|
}
|
|
112
125
|
async *chatStream(params) {
|
|
113
126
|
const body = this.buildRequestBody(params, true);
|
|
127
|
+
const timeout = AbortSignal.timeout(this.config.timeout ?? 120_000);
|
|
128
|
+
// Compose the caller abort with the request timeout so a Stop cancels the
|
|
129
|
+
// response body stream. When no caller signal is present this is the exact
|
|
130
|
+
// prior `AbortSignal.timeout(...)` expression (byte-identical).
|
|
131
|
+
const signal = params.signal ? AbortSignal.any([timeout, params.signal]) : timeout;
|
|
114
132
|
const response = await fetch(`${this.baseUrl}/chat/completions`, {
|
|
115
133
|
method: 'POST',
|
|
116
134
|
headers: this.getHeaders(),
|
|
117
135
|
body: JSON.stringify(body),
|
|
118
|
-
signal
|
|
136
|
+
signal,
|
|
119
137
|
});
|
|
120
138
|
if (!response.ok) {
|
|
121
139
|
const errorBody = await response.text();
|
|
@@ -129,6 +147,7 @@ export class OpenRouterProvider {
|
|
|
129
147
|
let buffer = '';
|
|
130
148
|
try {
|
|
131
149
|
while (true) {
|
|
150
|
+
params.signal?.throwIfAborted();
|
|
132
151
|
const { done, value } = await reader.read();
|
|
133
152
|
if (done)
|
|
134
153
|
break;
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAWA,MAAM,mBAAmB,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,8BAA8B,CAAA;AAc7F,SAAS,UAAU,CAAC,GAAc;IACjC,IAAI,CAAC,GAAG,EAAE,CAAC;QACV,OAAO;YACN,YAAY,EAAE,CAAC;YACf,gBAAgB,EAAE,CAAC;YACnB,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,CAAC;YACf,gBAAgB,EAAE,CAAC;SACnB,CAAA;IACF,CAAC;IACD,OAAO;QACN,YAAY,EAAE,GAAG,CAAC,aAAa;QAC/B,gBAAgB,EAAE,GAAG,CAAC,iBAAiB;QACvC,WAAW,EAAE,GAAG,CAAC,YAAY;QAC7B,YAAY,EAAE,GAAG,CAAC,qBAAqB,EAAE,aAAa,IAAI,GAAG,CAAC,uBAAuB,IAAI,CAAC;QAC1F,gBAAgB,EAAE,GAAG,CAAC,2BAA2B,IAAI,CAAC;KACtD,CAAA;AACF,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAc;IACvC,IAAI,OAAO,EAAE,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAA;IACrC,OAAO,EAAE,CAAA;AACV,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAyB;IAC5D,aAAa,EAAE,IAAI;IACnB,iBAAiB,EAAE,IAAI;IACvB,uBAAuB,EAAE,IAAI;IAC7B,cAAc,EAAE,KAAK;CACrB,CAAA;AAED,MAAM,OAAO,kBAAkB;IACrB,EAAE,GAAG,YAAY,CAAA;IACjB,IAAI,GAAG,YAAY,CAAA;IACnB,YAAY,GAAG,uBAAuB,CAAA;IAEvC,MAAM,CAAkB;IACxB,OAAO,CAAQ;IAEvB,YAAY,MAAwB;QACnC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAA;QACxF,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,mBAAmB,CAAA;IACrD,CAAC;IAEO,UAAU;QACjB,MAAM,OAAO,GAA2B;YACvC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YAC7C,cAAc,EAAE,kBAAkB;SAClC,CAAA;QACD,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACzB,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAA;QAC9C,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC1B,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAA;QAC1C,CAAC;QACD,OAAO,OAAO,CAAA;IACf,CAAC;IAEO,cAAc,CAAC,QAA0C;QAChE,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAC3B,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACzB,OAAO;oBACN,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,YAAY,EAAG,GAA+B,CAAC,UAAU;iBACzD,CAAA;YACF,CAAC;YACD,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,IAAI,WAAW,IAAI,GAAG,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;gBACrE,OAAO;oBACN,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,UAAU,EAAE,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;wBACtC,EAAE,EAAE,EAAE,CAAC,EAAE;wBACT,IAAI,EAAE,EAAE,CAAC,IAAI;wBACb,QAAQ,EAAE,EAAE,CAAC,QAAQ;qBACrB,CAAC,CAAC;iBACH,CAAA;YACF,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAA;QAChD,CAAC,CAAC,CAAA;IACH,CAAC;IAEO,gBAAgB,CAAC,MAA4B,EAAE,MAAe;QACrE,MAAM,IAAI,GAA4B;YACrC,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC;YAC9C,MAAM;SACN,CAAA;QAED,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;QAC1B,CAAC;QACD,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACrC,IAAI,CAAC,WAAW,GAAG,gBAAgB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;QACvD,CAAC;QACD,IAAI,MAAM,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;YAC5C,IAAI,CAAC,mBAAmB,GAAG,MAAM,CAAC,iBAAiB,CAAA;QACpD,CAAC;QAED,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS;YAAE,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAA;QAC3E,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS;YAAE,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,SAAS,CAAA;QACtE,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAA;QACvD,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAA;QACvD,IAAI,MAAM,CAAC,gBAAgB,KAAK,SAAS;YAAE,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,gBAAgB,CAAA;QAC3F,IAAI,MAAM,CAAC,eAAe,KAAK,SAAS;YAAE,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,eAAe,CAAA;QACxF,IAAI,MAAM,CAAC,iBAAiB,KAAK,SAAS;YAAE,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,iBAAiB,CAAA;QAC9F,IAAI,MAAM,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;QAExC,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACzB,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,YAAY,CAAA;QACzC,CAAC;QAED,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAC3B,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,cAAc,CAAA;QAC7C,CAAC;QAED,OAAO,IAAI,CAAA;IACZ,CAAC;IAED,KAAK,CAAC,CAAC,UAAU,CAAC,MAA4B;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QAEhD,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,CAAA;QACnE,0EAA0E;QAC1E,2EAA2E;QAC3E,gEAAgE;QAChE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;QAElF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,mBAAmB,EAAE;YAChE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;YAC1B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAC1B,MAAM;SACN,CAAC,CAAA;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YAClB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;YACvC,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAA;QAC3E,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;QACtD,CAAC;QAED,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAA;QACxC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAA;QACjC,IAAI,MAAM,GAAG,EAAE,CAAA;QAEf,IAAI,CAAC;YACJ,OAAO,IAAI,EAAE,CAAC;gBACb,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,CAAA;gBAC/B,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;gBAC3C,IAAI,IAAI;oBAAE,MAAK;gBAEf,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;gBACjD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;gBAChC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAA;gBAE1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;oBAC3B,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC;wBAAE,SAAQ;oBACvD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;oBAC7B,IAAI,IAAI,KAAK,QAAQ;wBAAE,OAAM;oBAE7B,IAAI,CAAC;wBACJ,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAe7B,CAAA;wBAED,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;wBAChC,IAAI,CAAC,MAAM;4BAAE,SAAQ;wBAErB,MAAM;4BACL,EAAE,EAAE,MAAM,CAAC,EAAE;4BACb,KAAK,EAAE;gCACN,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO;gCAC7B,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;oCAChD,KAAK,EAAE,EAAE,CAAC,KAAK;oCACf,EAAE,EAAE,EAAE,CAAC,EAAE;oCACT,IAAI,EAAE,EAAE,CAAC,IAA8B;oCACvC,QAAQ,EAAE,EAAE,CAAC,QAAQ;iCACrB,CAAC,CAAC;6BACH;4BACD,YAAY,EAAE,MAAM,CAAC,aAA4C;4BACjE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;yBAC1D,CAAA;oBACF,CAAC;oBAAC,OAAO,QAAQ,EAAE,CAAC;wBACnB,MAAM;4BACL,EAAE,EAAE,EAAE;4BACN,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE;4BAC7B,YAAY,EAAE,SAAS;4BACvB,KAAK,EAAE,SAAS;4BAChB,KAAK,EAAE,uBAAuB,QAAQ,YAAY,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;yBAC/F,CAAA;oBACF,CAAC;gBACF,CAAC;YACF,CAAC;QACF,CAAC;gBAAS,CAAC;YACV,MAAM,CAAC,WAAW,EAAE,CAAA;QACrB,CAAC;IACF,CAAC;IAED,KAAK,CAAC,UAAU;QACf,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,SAAS,EAAE;YACtD,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;SAC1B,CAAC,CAAA;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;QAC7D,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAQlC,CAAA;QAED,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5B,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,aAAa,EAAE,CAAC,CAAC,cAAc;YAC/B,eAAe,EAAE,CAAC,CAAC,YAAY,EAAE,qBAAqB,IAAI,IAAI;YAC9D,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,CAAC,GAAG,SAAS;YACnE,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,EAAE,UAAU,IAAI,GAAG,CAAC,GAAG,SAAS;YACxE,eAAe,EAAE,IAAI;YACrB,iBAAiB,EAAE,IAAI;SACvB,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,WAAW;QAChB,IAAI,CAAC;YACJ,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,SAAS,EAAE;gBACtD,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;gBAC1B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;aACjC,CAAC,CAAA;YACF,OAAO,QAAQ,CAAC,EAAE,CAAA;QACnB,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,KAAK,CAAA;QACb,CAAC;IACF,CAAC;CACD"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type RegisterOptions } from '@namzu/sdk';
|
|
2
2
|
import type { OpenRouterProviderConfig } from './types.js';
|
|
3
3
|
declare module '@namzu/sdk' {
|
|
4
4
|
interface ProviderConfigRegistry {
|
|
5
5
|
openrouter: OpenRouterProviderConfig;
|
|
6
6
|
}
|
|
7
7
|
}
|
|
8
|
-
export declare const OPENROUTER_CAPABILITIES: ProviderCapabilities;
|
|
9
8
|
/**
|
|
10
9
|
* Register `OpenRouterProvider` under the `'openrouter'` type in `@namzu/sdk`'s
|
|
11
10
|
* `ProviderRegistry`. Call once at app startup before
|
|
@@ -15,6 +14,6 @@ export declare const OPENROUTER_CAPABILITIES: ProviderCapabilities;
|
|
|
15
14
|
* Pass `{ replace: true }` to override.
|
|
16
15
|
*/
|
|
17
16
|
export declare function registerOpenRouter(options?: RegisterOptions): void;
|
|
18
|
-
export { OpenRouterProvider } from './client.js';
|
|
17
|
+
export { OPENROUTER_CAPABILITIES, OpenRouterProvider } from './client.js';
|
|
19
18
|
export type { OpenRouterConfig, OpenRouterProviderConfig } from './types.js';
|
|
20
19
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,eAAe,EAAE,MAAM,YAAY,CAAA;AAEnE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAK1D,OAAO,QAAQ,YAAY,CAAC;IAC3B,UAAU,sBAAsB;QAC/B,UAAU,EAAE,wBAAwB,CAAA;KACpC;CACD;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI,CAElE;AAED,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AACzE,YAAY,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,5 @@
|
|
|
1
1
|
import { ProviderRegistry } from '@namzu/sdk';
|
|
2
|
-
import { OpenRouterProvider } from './client.js';
|
|
3
|
-
export const OPENROUTER_CAPABILITIES = {
|
|
4
|
-
supportsTools: true,
|
|
5
|
-
supportsStreaming: true,
|
|
6
|
-
supportsFunctionCalling: true,
|
|
7
|
-
};
|
|
2
|
+
import { OPENROUTER_CAPABILITIES, OpenRouterProvider } from './client.js';
|
|
8
3
|
/**
|
|
9
4
|
* Register `OpenRouterProvider` under the `'openrouter'` type in `@namzu/sdk`'s
|
|
10
5
|
* `ProviderRegistry`. Call once at app startup before
|
|
@@ -16,5 +11,5 @@ export const OPENROUTER_CAPABILITIES = {
|
|
|
16
11
|
export function registerOpenRouter(options) {
|
|
17
12
|
ProviderRegistry.register('openrouter', OpenRouterProvider, OPENROUTER_CAPABILITIES, options);
|
|
18
13
|
}
|
|
19
|
-
export { OpenRouterProvider } from './client.js';
|
|
14
|
+
export { OPENROUTER_CAPABILITIES, OpenRouterProvider } from './client.js';
|
|
20
15
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAwB,MAAM,YAAY,CAAA;AACnE,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAYzE;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAyB;IAC3D,gBAAgB,CAAC,QAAQ,CAAC,YAAY,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,OAAO,CAAC,CAAA;AAC9F,CAAC;AAED,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@namzu/openrouter",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "OpenRouter LLM provider for @namzu/sdk. Access to 200+ models (Claude, GPT-4, Llama, Mixtral) via OpenRouter's unified API.",
|
|
5
5
|
"license": "FSL-1.1-MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"@types/node": "^22.19.17",
|
|
43
43
|
"typescript": "^5.5.0",
|
|
44
44
|
"vitest": "^2.0.0",
|
|
45
|
-
"@namzu/sdk": "^1.
|
|
45
|
+
"@namzu/sdk": "^1.2.0"
|
|
46
46
|
},
|
|
47
47
|
"scripts": {
|
|
48
48
|
"build": "tsc --build",
|
|
@@ -44,8 +44,14 @@ describe('@namzu/openrouter', () => {
|
|
|
44
44
|
supportsTools: true,
|
|
45
45
|
supportsStreaming: true,
|
|
46
46
|
supportsFunctionCalling: true,
|
|
47
|
+
supportsVision: false,
|
|
47
48
|
})
|
|
48
49
|
})
|
|
50
|
+
|
|
51
|
+
it('is exposed on the provider instance for runtime negotiation', () => {
|
|
52
|
+
const provider = new OpenRouterProvider({ apiKey: 'test-key' })
|
|
53
|
+
expect(provider.capabilities).toEqual(OPENROUTER_CAPABILITIES)
|
|
54
|
+
})
|
|
49
55
|
})
|
|
50
56
|
|
|
51
57
|
describe('ProviderRegistry.create({ type: "openrouter", ... })', () => {
|
package/src/client.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type {
|
|
|
2
2
|
ChatCompletionParams,
|
|
3
3
|
LLMProvider,
|
|
4
4
|
ModelInfo,
|
|
5
|
+
ProviderCapabilities,
|
|
5
6
|
StreamChunk,
|
|
6
7
|
TokenUsage,
|
|
7
8
|
ToolChoice,
|
|
@@ -46,9 +47,23 @@ function formatToolChoice(tc: ToolChoice): unknown {
|
|
|
46
47
|
return tc
|
|
47
48
|
}
|
|
48
49
|
|
|
50
|
+
/**
|
|
51
|
+
* What this DRIVER does, not what OpenRouter could do: tools pass
|
|
52
|
+
* through to the request body, but user-message image `attachments`
|
|
53
|
+
* are not mapped into content parts — `supportsVision` stays false
|
|
54
|
+
* until the message translation handles them.
|
|
55
|
+
*/
|
|
56
|
+
export const OPENROUTER_CAPABILITIES: ProviderCapabilities = {
|
|
57
|
+
supportsTools: true,
|
|
58
|
+
supportsStreaming: true,
|
|
59
|
+
supportsFunctionCalling: true,
|
|
60
|
+
supportsVision: false,
|
|
61
|
+
}
|
|
62
|
+
|
|
49
63
|
export class OpenRouterProvider implements LLMProvider {
|
|
50
64
|
readonly id = 'openrouter'
|
|
51
65
|
readonly name = 'OpenRouter'
|
|
66
|
+
readonly capabilities = OPENROUTER_CAPABILITIES
|
|
52
67
|
|
|
53
68
|
private config: OpenRouterConfig
|
|
54
69
|
private baseUrl: string
|
|
@@ -139,11 +154,17 @@ export class OpenRouterProvider implements LLMProvider {
|
|
|
139
154
|
async *chatStream(params: ChatCompletionParams): AsyncIterable<StreamChunk> {
|
|
140
155
|
const body = this.buildRequestBody(params, true)
|
|
141
156
|
|
|
157
|
+
const timeout = AbortSignal.timeout(this.config.timeout ?? 120_000)
|
|
158
|
+
// Compose the caller abort with the request timeout so a Stop cancels the
|
|
159
|
+
// response body stream. When no caller signal is present this is the exact
|
|
160
|
+
// prior `AbortSignal.timeout(...)` expression (byte-identical).
|
|
161
|
+
const signal = params.signal ? AbortSignal.any([timeout, params.signal]) : timeout
|
|
162
|
+
|
|
142
163
|
const response = await fetch(`${this.baseUrl}/chat/completions`, {
|
|
143
164
|
method: 'POST',
|
|
144
165
|
headers: this.getHeaders(),
|
|
145
166
|
body: JSON.stringify(body),
|
|
146
|
-
signal
|
|
167
|
+
signal,
|
|
147
168
|
})
|
|
148
169
|
|
|
149
170
|
if (!response.ok) {
|
|
@@ -161,6 +182,7 @@ export class OpenRouterProvider implements LLMProvider {
|
|
|
161
182
|
|
|
162
183
|
try {
|
|
163
184
|
while (true) {
|
|
185
|
+
params.signal?.throwIfAborted()
|
|
164
186
|
const { done, value } = await reader.read()
|
|
165
187
|
if (done) break
|
|
166
188
|
|
package/src/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { OpenRouterProvider } from './client.js'
|
|
1
|
+
import { ProviderRegistry, type RegisterOptions } from '@namzu/sdk'
|
|
2
|
+
import { OPENROUTER_CAPABILITIES, OpenRouterProvider } from './client.js'
|
|
3
3
|
import type { OpenRouterProviderConfig } from './types.js'
|
|
4
4
|
|
|
5
5
|
// Module augmentation: register openrouter's config type in the sdk's registry
|
|
@@ -11,12 +11,6 @@ declare module '@namzu/sdk' {
|
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
export const OPENROUTER_CAPABILITIES: ProviderCapabilities = {
|
|
15
|
-
supportsTools: true,
|
|
16
|
-
supportsStreaming: true,
|
|
17
|
-
supportsFunctionCalling: true,
|
|
18
|
-
}
|
|
19
|
-
|
|
20
14
|
/**
|
|
21
15
|
* Register `OpenRouterProvider` under the `'openrouter'` type in `@namzu/sdk`'s
|
|
22
16
|
* `ProviderRegistry`. Call once at app startup before
|
|
@@ -29,5 +23,5 @@ export function registerOpenRouter(options?: RegisterOptions): void {
|
|
|
29
23
|
ProviderRegistry.register('openrouter', OpenRouterProvider, OPENROUTER_CAPABILITIES, options)
|
|
30
24
|
}
|
|
31
25
|
|
|
32
|
-
export { OpenRouterProvider } from './client.js'
|
|
26
|
+
export { OPENROUTER_CAPABILITIES, OpenRouterProvider } from './client.js'
|
|
33
27
|
export type { OpenRouterConfig, OpenRouterProviderConfig } from './types.js'
|