@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.
- package/README.md +117 -0
- package/dist/ai/index.js +661 -54
- package/dist/ai/index.js.map +14 -12
- package/dist/ai/providers/anthropic.js +6 -2
- package/dist/ai/providers/anthropic.js.map +4 -4
- package/dist/ai/providers/gemini.js +33 -3
- package/dist/ai/providers/gemini.js.map +4 -4
- package/dist/ai/providers/ollama.js +3 -2
- package/dist/ai/providers/ollama.js.map +3 -3
- package/dist/ai/providers/openai.js +130 -35
- package/dist/ai/providers/openai.js.map +4 -4
- package/dist/ai/providers/openaiCompatible.js +130 -35
- package/dist/ai/providers/openaiCompatible.js.map +4 -4
- package/dist/ai/providers/openaiResponses.js +48 -18
- package/dist/ai/providers/openaiResponses.js.map +4 -4
- package/dist/ai/providers/openrouter.js +1757 -0
- package/dist/ai/providers/openrouter.js.map +17 -0
- package/dist/src/ai/generateAI.d.ts +4 -1
- package/dist/src/ai/index.d.ts +2 -0
- package/dist/src/ai/providers/openai.d.ts +7 -3
- package/dist/src/ai/providers/openaiResponses.d.ts +9 -4
- package/dist/src/ai/providers/openrouter.d.ts +113 -0
- package/dist/src/ai/providers/openrouterClient.d.ts +147 -0
- package/dist/types/ai.d.ts +63 -6
- package/package.json +9 -2
|
@@ -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
|
+
};
|
package/dist/types/ai.d.ts
CHANGED
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
import type { SessionStore } from "./session";
|
|
2
2
|
export type AIUsage = {
|
|
3
|
-
/**
|
|
3
|
+
/** Prompt-cache reads reported separately from uncached input. */
|
|
4
4
|
cacheReadInputTokens?: number;
|
|
5
|
-
/**
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
],
|