@absolutejs/ai 0.0.49 → 0.0.50

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.
@@ -0,0 +1,147 @@
1
+ export type OpenRouterClientConfig = {
2
+ allowedModels?: readonly string[];
3
+ apiKey?: string;
4
+ baseUrl?: string;
5
+ fetch?: typeof globalThis.fetch;
6
+ headers?: HeadersInit | (() => HeadersInit | Promise<HeadersInit>);
7
+ tokenSource?: () => Promise<string> | string;
8
+ };
9
+ export type OpenRouterModel = {
10
+ id: string;
11
+ name?: string;
12
+ description?: string;
13
+ context_length?: number;
14
+ architecture?: Record<string, unknown>;
15
+ pricing?: Record<string, string>;
16
+ supported_parameters?: string[] | Record<string, unknown>;
17
+ [field: string]: unknown;
18
+ };
19
+ export type OpenRouterModelList = {
20
+ data: OpenRouterModel[];
21
+ };
22
+ export type OpenRouterEmbeddingRequest = {
23
+ model: string;
24
+ input: string | string[] | number[] | number[][];
25
+ dimensions?: number;
26
+ encoding_format?: "float" | "base64";
27
+ provider?: Record<string, unknown>;
28
+ user?: string;
29
+ };
30
+ export type OpenRouterEmbeddingResponse = {
31
+ data: Array<{
32
+ embedding: number[] | string;
33
+ index: number;
34
+ object: string;
35
+ }>;
36
+ model: string;
37
+ object: string;
38
+ usage?: {
39
+ prompt_tokens: number;
40
+ total_tokens: number;
41
+ cost?: number;
42
+ };
43
+ };
44
+ export type OpenRouterRerankRequest = {
45
+ model: string;
46
+ query: string;
47
+ documents: Array<string | {
48
+ text: string;
49
+ }>;
50
+ top_n?: number;
51
+ return_documents?: boolean;
52
+ };
53
+ export type OpenRouterRerankResponse = {
54
+ id?: string;
55
+ model?: string;
56
+ results: Array<{
57
+ document?: {
58
+ text: string;
59
+ };
60
+ index: number;
61
+ relevance_score: number;
62
+ }>;
63
+ usage?: Record<string, number>;
64
+ };
65
+ export type OpenRouterImageRequest = {
66
+ model: string;
67
+ prompt: string;
68
+ n?: number;
69
+ resolution?: string;
70
+ aspect_ratio?: string;
71
+ size?: string;
72
+ quality?: "auto" | "low" | "medium" | "high";
73
+ output_format?: "png" | "jpeg" | "webp" | "svg";
74
+ background?: "auto" | "transparent" | "opaque";
75
+ output_compression?: number;
76
+ seed?: number;
77
+ input_references?: Array<Record<string, unknown>>;
78
+ provider?: Record<string, unknown>;
79
+ };
80
+ export type OpenRouterImageResponse = {
81
+ created: number;
82
+ data: Array<{
83
+ b64_json: string;
84
+ media_type?: string;
85
+ }>;
86
+ usage?: Record<string, number>;
87
+ };
88
+ export type OpenRouterResponsesRequest = Record<string, unknown> & {
89
+ input: unknown;
90
+ model: string;
91
+ stream?: boolean;
92
+ };
93
+ export type OpenRouterSpeechRequest = Record<string, unknown> & {
94
+ input: string;
95
+ model: string;
96
+ voice: string;
97
+ };
98
+ export type OpenRouterTranscriptionRequest = Record<string, unknown> & {
99
+ model: string;
100
+ };
101
+ export type OpenRouterVideoRequest = Record<string, unknown> & {
102
+ model: string;
103
+ prompt: string;
104
+ };
105
+ export type OpenRouterHttpRequestOptions = Omit<RequestInit, "body" | "headers"> & {
106
+ body?: unknown;
107
+ headers?: HeadersInit;
108
+ query?: Record<string, boolean | number | string | undefined>;
109
+ };
110
+ export type OpenRouterClient = ReturnType<typeof createOpenRouterClient>;
111
+ export declare const openRouterModelMatchesRule: (model: string, rule: string) => boolean;
112
+ export declare const createOpenRouterClient: (config: OpenRouterClientConfig) => {
113
+ cancelBatch: (id: string) => Promise<Record<string, unknown>>;
114
+ createBatch: (body: Record<string, unknown>) => Promise<Record<string, unknown>>;
115
+ createEmbedding: (body: OpenRouterEmbeddingRequest) => Promise<OpenRouterEmbeddingResponse>;
116
+ generateImage: (body: OpenRouterImageRequest) => Promise<OpenRouterImageResponse>;
117
+ generateVideo: (body: OpenRouterVideoRequest) => Promise<Record<string, unknown>>;
118
+ getBatch: (id: string) => Promise<Record<string, unknown>>;
119
+ getCredits: () => Promise<{
120
+ data: Record<string, number>;
121
+ }>;
122
+ getCurrentKey: () => Promise<{
123
+ data: Record<string, unknown>;
124
+ }>;
125
+ getGeneration: (id: string) => Promise<{
126
+ data: Record<string, unknown>;
127
+ }>;
128
+ getModelEndpoints: (model: string) => Promise<Record<string, unknown>>;
129
+ getVideo: (id: string) => Promise<Record<string, unknown>>;
130
+ listImageModels: () => Promise<OpenRouterModelList>;
131
+ listModels: (query?: OpenRouterHttpRequestOptions["query"]) => Promise<OpenRouterModelList>;
132
+ listPresets: (offset?: number, limit?: number) => Promise<{
133
+ data: Record<string, unknown>[];
134
+ total_count: number;
135
+ }>;
136
+ listProviders: () => Promise<{
137
+ data: Record<string, unknown>[];
138
+ }>;
139
+ listRerankModels: () => Promise<OpenRouterModelList>;
140
+ listVideoModels: () => Promise<OpenRouterModelList>;
141
+ request: <T>(path: string, options?: OpenRouterHttpRequestOptions) => Promise<T>;
142
+ requestRaw: (path: string, options?: OpenRouterHttpRequestOptions) => Promise<Response>;
143
+ respond: (body: OpenRouterResponsesRequest) => Promise<Response> | Promise<Record<string, unknown>>;
144
+ rerank: (body: OpenRouterRerankRequest) => Promise<OpenRouterRerankResponse>;
145
+ speak: (body: OpenRouterSpeechRequest) => Promise<Response>;
146
+ transcribe: (body: OpenRouterTranscriptionRequest | FormData) => Promise<Record<string, unknown>>;
147
+ };
@@ -1,11 +1,19 @@
1
1
  import type { SessionStore } from "./session";
2
2
  export type AIUsage = {
3
- /** Anthropic prompt-cache reads (billed at 0.10x input). Omitted when unused. */
3
+ /** Prompt-cache reads reported separately from uncached input. */
4
4
  cacheReadInputTokens?: number;
5
- /** Anthropic prompt-cache writes (billed at 1.25x input). Omitted when unused. */
5
+ /** Prompt-cache writes reported separately from uncached input. */
6
6
  cacheWriteInputTokens?: number;
7
+ /** Provider-reported charge in account credits, when returned by the API. */
8
+ costCredits?: number;
7
9
  inputTokens: number;
8
10
  outputTokens: number;
11
+ /** Completion tokens spent on internal reasoning, when reported separately. */
12
+ reasoningTokens?: number;
13
+ /** Provider-hosted tool calls, keyed by the provider's usage counter. */
14
+ serverToolUse?: Record<string, number>;
15
+ /** Upstream inference charge in provider credits, when exposed by a router. */
16
+ upstreamInferenceCostCredits?: number;
9
17
  };
10
18
  export type RAGSource = {
11
19
  chunkId: string;
@@ -109,10 +117,27 @@ export type AIToolUseChunk = {
109
117
  input: unknown;
110
118
  };
111
119
  export type AIDoneChunk = {
120
+ metadata?: AIResponseMetadata;
112
121
  type: "done";
113
122
  usage?: AIUsage;
114
123
  stopReason?: string;
115
124
  };
125
+ export type AIResponseMetadata = {
126
+ generationId?: string;
127
+ model?: string;
128
+ provider?: string;
129
+ serviceTier?: string;
130
+ /** Provider-native response metadata for routing and diagnostics. */
131
+ providerMetadata?: Record<string, unknown>;
132
+ };
133
+ export type AICitationChunk = {
134
+ type: "citation";
135
+ url: string;
136
+ title?: string;
137
+ content?: string;
138
+ startIndex?: number;
139
+ endIndex?: number;
140
+ };
116
141
  export type AIThinkingChunk = {
117
142
  type: "thinking";
118
143
  content: string;
@@ -130,7 +155,7 @@ export type AIUsageUpdateChunk = {
130
155
  type: "usage_update";
131
156
  usage: AIUsage;
132
157
  };
133
- export type AIChunk = AITextChunk | AIThinkingChunk | AIToolUseChunk | AIImageChunk | AIUsageUpdateChunk | AIDoneChunk;
158
+ export type AIChunk = AITextChunk | AIThinkingChunk | AIToolUseChunk | AIImageChunk | AICitationChunk | AIUsageUpdateChunk | AIDoneChunk;
134
159
  export type AIProviderToolChoice = "auto" | "none" | "required" | {
135
160
  name: string;
136
161
  };
@@ -188,6 +213,8 @@ export type AIProviderStreamParams = {
188
213
  }) => void;
189
214
  parallelToolCalls?: boolean;
190
215
  presencePenalty?: number;
216
+ /** Provider-specific request options, keyed by provider name. */
217
+ providerOptions?: Record<string, unknown>;
191
218
  /**
192
219
  * Per-call override for the provider's `promptCaching` default. Leave unset to
193
220
  * inherit the provider config. Set `false` to skip ALL cache breakpoints for
@@ -218,15 +245,37 @@ export type AIProviderMessage = {
218
245
  content: string | AIProviderContentBlock[];
219
246
  };
220
247
  export type AIImageSource = {
248
+ media_type: "image/png" | "image/jpeg" | "image/gif" | "image/webp";
249
+ } & ({
221
250
  type: "base64";
222
251
  data: string;
223
- media_type: "image/png" | "image/jpeg" | "image/gif" | "image/webp";
224
- };
252
+ } | {
253
+ type: "url";
254
+ url: string;
255
+ });
225
256
  export type AIDocumentSource = {
257
+ media_type: "application/pdf";
258
+ } & ({
226
259
  type: "base64";
227
260
  data: string;
228
- media_type: "application/pdf";
261
+ } | {
262
+ type: "url";
263
+ url: string;
264
+ });
265
+ export type AIAudioSource = {
266
+ type: "base64";
267
+ data: string;
268
+ format: "wav" | "mp3" | "aiff" | "aac" | "ogg" | "flac" | "m4a" | "pcm16" | "pcm24";
229
269
  };
270
+ export type AIVideoSource = {
271
+ media_type: "video/mp4" | "video/mpeg" | "video/quicktime" | "video/webm";
272
+ } & ({
273
+ type: "base64";
274
+ data: string;
275
+ } | {
276
+ type: "url";
277
+ url: string;
278
+ });
230
279
  export type AIProviderContentBlock = {
231
280
  type: "text";
232
281
  content: string;
@@ -241,6 +290,12 @@ export type AIProviderContentBlock = {
241
290
  type: "document";
242
291
  source: AIDocumentSource;
243
292
  name?: string;
293
+ } | {
294
+ type: "audio";
295
+ source: AIAudioSource;
296
+ } | {
297
+ type: "video";
298
+ source: AIVideoSource;
244
299
  } | {
245
300
  type: "tool_use";
246
301
  id: string;
@@ -510,6 +565,8 @@ export type StreamAIOptions = {
510
565
  cacheSystemPrompt?: boolean;
511
566
  /** Per-call override of the provider `promptCaching` default. See AIProviderStreamParams. */
512
567
  promptCaching?: boolean;
568
+ /** Provider-specific options forwarded to every model turn. */
569
+ providerOptions?: Record<string, unknown>;
513
570
  tools?: AIToolMap;
514
571
  /** Portable reasoning effort — translated per provider/model. */
515
572
  reasoning?: ReasoningConfig;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@absolutejs/ai",
3
- "version": "0.0.49",
3
+ "version": "0.0.50",
4
4
  "homepage": "https://github.com/absolutejs/ai",
5
5
  "bugs": {
6
6
  "url": "https://github.com/absolutejs/ai/issues"
@@ -59,6 +59,10 @@
59
59
  "import": "./dist/ai/providers/openaiCompatible.js",
60
60
  "types": "./dist/src/ai/providers/openaiCompatible.d.ts"
61
61
  },
62
+ "./openrouter": {
63
+ "import": "./dist/ai/providers/openrouter.js",
64
+ "types": "./dist/src/ai/providers/openrouter.d.ts"
65
+ },
62
66
  "./openai-responses": {
63
67
  "import": "./dist/ai/providers/openaiResponses.js",
64
68
  "types": "./dist/src/ai/providers/openaiResponses.d.ts"
@@ -110,7 +114,7 @@
110
114
  }
111
115
  },
112
116
  "devDependencies": {
113
- "@absolutejs/absolute": "^0.19.0-beta.1051",
117
+ "@absolutejs/absolute": "^0.20.0-beta.0",
114
118
  "@absolutejs/isolated-jsc": "0.6.0",
115
119
  "@angular/core": "^21.0.0",
116
120
  "@eslint/js": "^10.0.1",
@@ -175,6 +179,9 @@
175
179
  "openai-compatible": [
176
180
  "dist/src/ai/providers/openaiCompatible.d.ts"
177
181
  ],
182
+ "openrouter": [
183
+ "dist/src/ai/providers/openrouter.d.ts"
184
+ ],
178
185
  "openai-responses": [
179
186
  "dist/src/ai/providers/openaiResponses.d.ts"
180
187
  ],