offrouter-core 0.2.0 → 0.2.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.
Files changed (139) hide show
  1. package/dist/audit.d.ts +137 -0
  2. package/dist/audit.d.ts.map +1 -0
  3. package/dist/audit.js +320 -0
  4. package/dist/audit.js.map +1 -0
  5. package/dist/auth/credential-chain.d.ts +84 -0
  6. package/dist/auth/credential-chain.d.ts.map +1 -0
  7. package/dist/auth/credential-chain.js +150 -0
  8. package/dist/auth/credential-chain.js.map +1 -0
  9. package/dist/auth/index.d.ts +10 -0
  10. package/dist/auth/index.d.ts.map +1 -0
  11. package/dist/auth/index.js +7 -0
  12. package/dist/auth/index.js.map +1 -0
  13. package/dist/auth/keychain.d.ts +60 -0
  14. package/dist/auth/keychain.d.ts.map +1 -0
  15. package/dist/auth/keychain.js +104 -0
  16. package/dist/auth/keychain.js.map +1 -0
  17. package/dist/auth/oauth-pkce.d.ts +138 -0
  18. package/dist/auth/oauth-pkce.d.ts.map +1 -0
  19. package/dist/auth/oauth-pkce.js +375 -0
  20. package/dist/auth/oauth-pkce.js.map +1 -0
  21. package/dist/auth/oauth-server.d.ts +36 -0
  22. package/dist/auth/oauth-server.d.ts.map +1 -0
  23. package/dist/auth/oauth-server.js +210 -0
  24. package/dist/auth/oauth-server.js.map +1 -0
  25. package/dist/config.d.ts +76 -0
  26. package/dist/config.d.ts.map +1 -0
  27. package/dist/config.js +355 -0
  28. package/dist/config.js.map +1 -0
  29. package/dist/delegation.d.ts +123 -0
  30. package/dist/delegation.d.ts.map +1 -0
  31. package/dist/delegation.js +455 -0
  32. package/dist/delegation.js.map +1 -0
  33. package/dist/index.d.ts +41 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +26 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/policy.d.ts +45 -0
  38. package/dist/policy.d.ts.map +1 -0
  39. package/dist/policy.js +318 -0
  40. package/dist/policy.js.map +1 -0
  41. package/{src/protocol.ts → dist/protocol.d.ts} +2 -2
  42. package/dist/protocol.d.ts.map +1 -0
  43. package/dist/protocol.js +6 -0
  44. package/dist/protocol.js.map +1 -0
  45. package/dist/providers/adapter.d.ts +137 -0
  46. package/dist/providers/adapter.d.ts.map +1 -0
  47. package/dist/providers/adapter.js +163 -0
  48. package/dist/providers/adapter.js.map +1 -0
  49. package/dist/providers/catalog-data.d.ts +128 -0
  50. package/dist/providers/catalog-data.d.ts.map +1 -0
  51. package/dist/providers/catalog-data.js +397 -0
  52. package/dist/providers/catalog-data.js.map +1 -0
  53. package/dist/providers/catalog.d.ts +63 -0
  54. package/dist/providers/catalog.d.ts.map +1 -0
  55. package/dist/providers/catalog.js +394 -0
  56. package/dist/providers/catalog.js.map +1 -0
  57. package/dist/providers/fake.d.ts +46 -0
  58. package/dist/providers/fake.d.ts.map +1 -0
  59. package/dist/providers/fake.js +234 -0
  60. package/dist/providers/fake.js.map +1 -0
  61. package/dist/providers/openai-compatible.d.ts +65 -0
  62. package/dist/providers/openai-compatible.d.ts.map +1 -0
  63. package/dist/providers/openai-compatible.js +434 -0
  64. package/dist/providers/openai-compatible.js.map +1 -0
  65. package/dist/proxy/responses-mapper.d.ts +366 -0
  66. package/dist/proxy/responses-mapper.d.ts.map +1 -0
  67. package/dist/proxy/responses-mapper.js +517 -0
  68. package/dist/proxy/responses-mapper.js.map +1 -0
  69. package/dist/proxy/responses-server.d.ts +29 -0
  70. package/dist/proxy/responses-server.d.ts.map +1 -0
  71. package/dist/proxy/responses-server.js +360 -0
  72. package/dist/proxy/responses-server.js.map +1 -0
  73. package/dist/router.d.ts +18 -0
  74. package/dist/router.d.ts.map +1 -0
  75. package/dist/router.js +296 -0
  76. package/dist/router.js.map +1 -0
  77. package/dist/schemas.d.ts +560 -0
  78. package/dist/schemas.d.ts.map +1 -0
  79. package/{src/schemas.ts → dist/schemas.js} +83 -103
  80. package/dist/schemas.js.map +1 -0
  81. package/dist/secrets.d.ts +112 -0
  82. package/dist/secrets.d.ts.map +1 -0
  83. package/dist/secrets.js +326 -0
  84. package/dist/secrets.js.map +1 -0
  85. package/dist/types.d.ts +117 -0
  86. package/dist/types.d.ts.map +1 -0
  87. package/dist/types.js +6 -0
  88. package/dist/types.js.map +1 -0
  89. package/dist/usage-file.d.ts +59 -0
  90. package/dist/usage-file.d.ts.map +1 -0
  91. package/dist/usage-file.js +316 -0
  92. package/dist/usage-file.js.map +1 -0
  93. package/dist/usage.d.ts +235 -0
  94. package/dist/usage.d.ts.map +1 -0
  95. package/dist/usage.js +517 -0
  96. package/dist/usage.js.map +1 -0
  97. package/package.json +9 -4
  98. package/src/audit.test.ts +0 -302
  99. package/src/audit.ts +0 -553
  100. package/src/auth/credential-chain.test.ts +0 -326
  101. package/src/auth/credential-chain.ts +0 -235
  102. package/src/auth/index.ts +0 -45
  103. package/src/auth/keychain.test.ts +0 -265
  104. package/src/auth/keychain.ts +0 -168
  105. package/src/auth/oauth-pkce.test.ts +0 -329
  106. package/src/auth/oauth-pkce.ts +0 -571
  107. package/src/auth/oauth-server.test.ts +0 -83
  108. package/src/auth/oauth-server.ts +0 -296
  109. package/src/config.test.ts +0 -479
  110. package/src/config.ts +0 -505
  111. package/src/delegation.test.ts +0 -368
  112. package/src/delegation.ts +0 -605
  113. package/src/index.ts +0 -280
  114. package/src/policy.test.ts +0 -634
  115. package/src/policy.ts +0 -420
  116. package/src/providers/adapter.test.ts +0 -293
  117. package/src/providers/adapter.ts +0 -328
  118. package/src/providers/catalog-data.test.ts +0 -258
  119. package/src/providers/catalog-data.ts +0 -498
  120. package/src/providers/catalog.test.ts +0 -84
  121. package/src/providers/catalog.ts +0 -483
  122. package/src/providers/fake.ts +0 -312
  123. package/src/providers/openai-compatible.test.ts +0 -366
  124. package/src/providers/openai-compatible.ts +0 -554
  125. package/src/proxy/responses-mapper.test.ts +0 -290
  126. package/src/proxy/responses-mapper.ts +0 -736
  127. package/src/proxy/responses-server.test.ts +0 -322
  128. package/src/proxy/responses-server.ts +0 -469
  129. package/src/router.test.ts +0 -699
  130. package/src/router.ts +0 -352
  131. package/src/schemas.test.ts +0 -291
  132. package/src/secrets.test.ts +0 -271
  133. package/src/secrets.ts +0 -461
  134. package/src/types.ts +0 -173
  135. package/src/usage-file.test.ts +0 -243
  136. package/src/usage-file.ts +0 -435
  137. package/src/usage.test.ts +0 -335
  138. package/src/usage.ts +0 -859
  139. package/tsconfig.json +0 -9
@@ -0,0 +1,434 @@
1
+ /**
2
+ * OpenAI-compatible HTTP adapter (OpenRouter / xAI / Ollama shapes).
3
+ * Tests inject fetch; live network only when caller enables it.
4
+ *
5
+ * Auth is presence-only: we set Authorization when a key is provided.
6
+ * Ollama accepts a dummy key when none is configured.
7
+ */
8
+ import { ProviderError, mapHttpToProviderError, } from "./adapter.js";
9
+ const OLLAMA_DUMMY_KEY = "ollama";
10
+ function joinUrl(base, path) {
11
+ const b = base.replace(/\/+$/, "");
12
+ const p = path.startsWith("/") ? path : `/${path}`;
13
+ return `${b}${p}`;
14
+ }
15
+ function headersFor(options, apiKey) {
16
+ const headers = {
17
+ "content-type": "application/json",
18
+ ...(options.defaultHeaders ?? {}),
19
+ };
20
+ const flavor = options.flavor ?? "openai";
21
+ const allowDummy = options.allowDummyKey ?? flavor === "ollama";
22
+ let key = apiKey?.trim() || undefined;
23
+ if (!key && allowDummy) {
24
+ key = OLLAMA_DUMMY_KEY;
25
+ }
26
+ if (key) {
27
+ headers.authorization = `Bearer ${key}`;
28
+ }
29
+ if (flavor === "openrouter") {
30
+ // OpenRouter recommended metadata; no secrets.
31
+ if (!headers["http-referer"]) {
32
+ headers["http-referer"] = "https://offrouter.dev";
33
+ }
34
+ if (!headers["x-title"]) {
35
+ headers["x-title"] = "OffRouter";
36
+ }
37
+ }
38
+ return headers;
39
+ }
40
+ export class OpenAiCompatibleAdapter {
41
+ id;
42
+ options;
43
+ active = new Map();
44
+ cancelled = new Set();
45
+ constructor(options) {
46
+ this.id = options.id;
47
+ this.options = options;
48
+ }
49
+ get fetchImpl() {
50
+ return this.options.fetch ?? globalThis.fetch.bind(globalThis);
51
+ }
52
+ offlineNetworkError(operation) {
53
+ if (process.env.OFFROUTER_LIVE_TESTS === "1" ||
54
+ this.options.fetch !== undefined) {
55
+ return null;
56
+ }
57
+ return new ProviderError({
58
+ code: "invalid_request",
59
+ message: `${operation} requires injected fetch or OFFROUTER_LIVE_TESTS=1`,
60
+ retryable: false,
61
+ });
62
+ }
63
+ resolvedAuthTier() {
64
+ if (this.options.authTier)
65
+ return this.options.authTier;
66
+ return this.options.flavor === "ollama" ? "local" : "api-key";
67
+ }
68
+ hasConfiguredKey() {
69
+ const key = this.options.apiKey?.trim();
70
+ return Boolean(key);
71
+ }
72
+ async listModels() {
73
+ if (this.options.models) {
74
+ return this.options.models.map((m) => ({ ...m }));
75
+ }
76
+ // Live path only when models not injected.
77
+ const offlineError = this.offlineNetworkError("listModels");
78
+ if (offlineError) {
79
+ throw offlineError;
80
+ }
81
+ const res = await this.fetchImpl(joinUrl(this.options.baseUrl, "/models"), {
82
+ method: "GET",
83
+ headers: headersFor(this.options, this.options.apiKey),
84
+ });
85
+ if (!res.ok) {
86
+ const text = await res.text().catch(() => undefined);
87
+ throw mapHttpToProviderError(res.status, text);
88
+ }
89
+ const json = (await res.json());
90
+ const data = json.data ?? [];
91
+ return data.map((m) => ({
92
+ modelId: m.id,
93
+ displayName: m.id,
94
+ supportsTools: true,
95
+ supportsStreaming: true,
96
+ supportsJson: true,
97
+ supportsImages: false,
98
+ }));
99
+ }
100
+ async checkAuth() {
101
+ const tier = this.resolvedAuthTier();
102
+ const flavor = this.options.flavor ?? "openai";
103
+ const allowDummy = this.options.allowDummyKey ?? flavor === "ollama";
104
+ const hasKey = this.hasConfiguredKey();
105
+ // Try credential chain resolution if sources are configured.
106
+ let credentialSource = undefined;
107
+ let resolvedKey = false;
108
+ if (this.options.credentialSources && this.options.secretStore) {
109
+ const { resolveCredential } = await import("../auth/credential-chain.js");
110
+ const result = await resolveCredential(this.options.credentialSources, {
111
+ store: this.options.secretStore,
112
+ });
113
+ if (result !== null) {
114
+ credentialSource = result.source;
115
+ resolvedKey = true;
116
+ }
117
+ }
118
+ // If credential chain found nothing, check the configured key or dummy.
119
+ const configured = tier === "local" ? true : hasKey || resolvedKey || allowDummy;
120
+ const finalCredentialSource = credentialSource ?? (hasKey ? "config" : allowDummy ? "none" : "none");
121
+ // OAuth providers are subscription-eligible when tokens are present.
122
+ // For api-key providers, subscriptionEligible is always false.
123
+ const isOAuthProvider = flavor === "openai" || flavor === "openrouter";
124
+ const subscriptionEligible = isOAuthProvider && credentialSource === "oauth";
125
+ return {
126
+ authTier: tier,
127
+ authScope: flavor === "openrouter"
128
+ ? "third-party"
129
+ : flavor === "ollama"
130
+ ? "first-party"
131
+ : "first-party",
132
+ configured,
133
+ hasApiKey: hasKey || resolvedKey,
134
+ subscriptionStatus: undefined,
135
+ limitsDiscoverable: !(this.options.opaqueLimits ?? tier !== "local"),
136
+ health: configured ? "healthy" : "dead",
137
+ detail: !hasKey && !resolvedKey && allowDummy ? "using_dummy_key" : undefined,
138
+ credentialSource: configured ? finalCredentialSource : "none",
139
+ subscriptionEligible,
140
+ };
141
+ }
142
+ async queryLimits(authTier) {
143
+ const opaque = this.options.opaqueLimits ?? this.resolvedAuthTier() !== "local";
144
+ if (opaque) {
145
+ return {
146
+ authTier,
147
+ discoverable: false,
148
+ opaque: true,
149
+ metadata: {
150
+ flavor: this.options.flavor ?? "openai",
151
+ note: "limits_not_exposed_by_provider",
152
+ },
153
+ };
154
+ }
155
+ return {
156
+ authTier,
157
+ discoverable: true,
158
+ opaque: false,
159
+ remaining: undefined,
160
+ limit: undefined,
161
+ unit: "unknown",
162
+ metadata: {
163
+ flavor: this.options.flavor ?? "openai",
164
+ source: "local_runtime",
165
+ },
166
+ };
167
+ }
168
+ async estimate(request, model, authTier) {
169
+ const previewLen = request.task.promptPreview.length;
170
+ const inputTokensEstimate = Math.max(1, Math.ceil(previewLen / 4));
171
+ const per1k = this.options.estimatedCostUsdPer1kTokens ?? 0.001;
172
+ const cost = authTier === "api-key" ? (inputTokensEstimate / 1000) * per1k : 0;
173
+ return {
174
+ model,
175
+ authTier,
176
+ estimatedCostUsd: cost,
177
+ currency: "USD",
178
+ inputTokensEstimate,
179
+ note: "heuristic prompt-preview estimate",
180
+ };
181
+ }
182
+ async *invoke(request) {
183
+ if (this.cancelled.has(request.callId) || request.signal?.aborted) {
184
+ yield {
185
+ type: "error",
186
+ callId: request.callId,
187
+ error: new ProviderError({
188
+ code: "cancelled",
189
+ message: `call ${request.callId} cancelled`,
190
+ retryable: false,
191
+ }),
192
+ };
193
+ return;
194
+ }
195
+ const offlineError = this.offlineNetworkError("invoke");
196
+ if (offlineError) {
197
+ yield { type: "error", callId: request.callId, error: offlineError };
198
+ return;
199
+ }
200
+ const controller = new AbortController();
201
+ this.active.set(request.callId, controller);
202
+ const onExternalAbort = () => controller.abort();
203
+ request.signal?.addEventListener("abort", onExternalAbort, { once: true });
204
+ yield {
205
+ type: "start",
206
+ callId: request.callId,
207
+ model: request.model,
208
+ };
209
+ try {
210
+ const stream = request.stream ?? false;
211
+ const body = {
212
+ model: request.model,
213
+ messages: request.messages.map((m) => ({
214
+ role: m.role,
215
+ content: m.content,
216
+ })),
217
+ stream,
218
+ ...(request.maxOutputTokens !== undefined
219
+ ? { max_tokens: request.maxOutputTokens }
220
+ : {}),
221
+ ...(request.temperature !== undefined
222
+ ? { temperature: request.temperature }
223
+ : {}),
224
+ };
225
+ const res = await this.fetchImpl(joinUrl(this.options.baseUrl, "/chat/completions"), {
226
+ method: "POST",
227
+ headers: headersFor(this.options, this.options.apiKey),
228
+ body: JSON.stringify(body),
229
+ signal: controller.signal,
230
+ });
231
+ if (!res.ok) {
232
+ const text = await res.text().catch(() => undefined);
233
+ const err = mapHttpToProviderError(res.status, text);
234
+ yield { type: "error", callId: request.callId, error: err };
235
+ return;
236
+ }
237
+ if (stream) {
238
+ if (!res.body) {
239
+ yield {
240
+ type: "error",
241
+ callId: request.callId,
242
+ error: new ProviderError({
243
+ code: "stream_interrupted",
244
+ message: "streaming response missing body",
245
+ retryable: true,
246
+ }),
247
+ };
248
+ return;
249
+ }
250
+ yield* this.readSseStream(request.callId, res.body, controller.signal);
251
+ return;
252
+ }
253
+ const json = (await res.json());
254
+ const text = json.choices?.[0]?.message?.content ?? "";
255
+ if (text) {
256
+ yield {
257
+ type: "text-delta",
258
+ callId: request.callId,
259
+ text,
260
+ };
261
+ }
262
+ if (json.usage) {
263
+ yield {
264
+ type: "usage",
265
+ callId: request.callId,
266
+ inputTokens: json.usage.prompt_tokens,
267
+ outputTokens: json.usage.completion_tokens,
268
+ totalTokens: json.usage.total_tokens,
269
+ };
270
+ }
271
+ yield {
272
+ type: "done",
273
+ callId: request.callId,
274
+ finishReason: json.choices?.[0]?.finish_reason ?? "stop",
275
+ };
276
+ }
277
+ catch (err) {
278
+ if (controller.signal.aborted || this.cancelled.has(request.callId)) {
279
+ yield {
280
+ type: "error",
281
+ callId: request.callId,
282
+ error: new ProviderError({
283
+ code: "cancelled",
284
+ message: `call ${request.callId} cancelled`,
285
+ retryable: false,
286
+ cause: err,
287
+ }),
288
+ };
289
+ return;
290
+ }
291
+ if (err instanceof ProviderError) {
292
+ yield { type: "error", callId: request.callId, error: err };
293
+ return;
294
+ }
295
+ const message = err instanceof Error ? err.message : "unknown network error";
296
+ yield {
297
+ type: "error",
298
+ callId: request.callId,
299
+ error: new ProviderError({
300
+ code: "network",
301
+ message,
302
+ retryable: true,
303
+ cause: err,
304
+ }),
305
+ };
306
+ }
307
+ finally {
308
+ request.signal?.removeEventListener("abort", onExternalAbort);
309
+ this.active.delete(request.callId);
310
+ }
311
+ }
312
+ async *readSseStream(callId, body, signal) {
313
+ const reader = body.getReader();
314
+ const decoder = new TextDecoder();
315
+ let buffer = "";
316
+ const onAbort = () => {
317
+ void reader.cancel().catch(() => undefined);
318
+ };
319
+ signal.addEventListener("abort", onAbort, { once: true });
320
+ try {
321
+ while (true) {
322
+ if (signal.aborted || this.cancelled.has(callId)) {
323
+ yield {
324
+ type: "error",
325
+ callId,
326
+ error: new ProviderError({
327
+ code: "cancelled",
328
+ message: `call ${callId} cancelled`,
329
+ retryable: false,
330
+ }),
331
+ };
332
+ return;
333
+ }
334
+ const { done, value } = await reader.read();
335
+ if (signal.aborted || this.cancelled.has(callId)) {
336
+ yield {
337
+ type: "error",
338
+ callId,
339
+ error: new ProviderError({
340
+ code: "cancelled",
341
+ message: `call ${callId} cancelled`,
342
+ retryable: false,
343
+ }),
344
+ };
345
+ return;
346
+ }
347
+ if (done)
348
+ break;
349
+ buffer += decoder.decode(value, { stream: true });
350
+ const parts = buffer.split("\n");
351
+ buffer = parts.pop() ?? "";
352
+ for (const line of parts) {
353
+ const trimmed = line.trim();
354
+ if (!trimmed.startsWith("data:"))
355
+ continue;
356
+ const payload = trimmed.slice(5).trim();
357
+ if (payload === "[DONE]") {
358
+ yield { type: "done", callId, finishReason: "stop" };
359
+ return;
360
+ }
361
+ try {
362
+ const json = JSON.parse(payload);
363
+ const delta = json.choices?.[0]?.delta?.content;
364
+ if (delta) {
365
+ yield { type: "text-delta", callId, text: delta };
366
+ }
367
+ if (json.usage) {
368
+ yield {
369
+ type: "usage",
370
+ callId,
371
+ inputTokens: json.usage.prompt_tokens,
372
+ outputTokens: json.usage.completion_tokens,
373
+ totalTokens: json.usage.total_tokens,
374
+ };
375
+ }
376
+ const finish = json.choices?.[0]?.finish_reason;
377
+ if (finish) {
378
+ yield { type: "done", callId, finishReason: finish };
379
+ return;
380
+ }
381
+ }
382
+ catch {
383
+ // ignore malformed sse lines
384
+ }
385
+ }
386
+ }
387
+ yield { type: "done", callId, finishReason: "stop" };
388
+ }
389
+ catch (err) {
390
+ if (signal.aborted || this.cancelled.has(callId)) {
391
+ yield {
392
+ type: "error",
393
+ callId,
394
+ error: new ProviderError({
395
+ code: "cancelled",
396
+ message: `call ${callId} cancelled`,
397
+ retryable: false,
398
+ cause: err,
399
+ }),
400
+ };
401
+ return;
402
+ }
403
+ yield {
404
+ type: "error",
405
+ callId,
406
+ error: new ProviderError({
407
+ code: "stream_interrupted",
408
+ message: err instanceof Error ? err.message : "stream interrupted",
409
+ retryable: true,
410
+ cause: err,
411
+ }),
412
+ };
413
+ }
414
+ finally {
415
+ signal.removeEventListener("abort", onAbort);
416
+ try {
417
+ reader.releaseLock();
418
+ }
419
+ catch {
420
+ // ignore
421
+ }
422
+ }
423
+ }
424
+ async cancel(callId) {
425
+ this.cancelled.add(callId);
426
+ this.active.get(callId)?.abort();
427
+ }
428
+ }
429
+ export function createOpenAiCompatibleAdapter(options) {
430
+ return new OpenAiCompatibleAdapter(options);
431
+ }
432
+ /** Exported for tests that assert Ollama dummy key behavior. */
433
+ export const OLLAMA_DUMMY_BEARER = `Bearer ${OLLAMA_DUMMY_KEY}`;
434
+ //# sourceMappingURL=openai-compatible.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-compatible.js","sourceRoot":"","sources":["../../src/providers/openai-compatible.ts"],"names":[],"mappings":"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"}