@aigne/afs-ai-gateway 1.12.0-beta.5
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/LICENSE.md +26 -0
- package/dist/_virtual/_@oxc-project_runtime@0.108.0/helpers/decorate.cjs +11 -0
- package/dist/_virtual/_@oxc-project_runtime@0.108.0/helpers/decorate.mjs +10 -0
- package/dist/_virtual/rolldown_runtime.cjs +29 -0
- package/dist/ai-gateway.cjs +1083 -0
- package/dist/ai-gateway.d.cts +124 -0
- package/dist/ai-gateway.d.cts.map +1 -0
- package/dist/ai-gateway.d.mts +124 -0
- package/dist/ai-gateway.d.mts.map +1 -0
- package/dist/ai-gateway.mjs +1083 -0
- package/dist/ai-gateway.mjs.map +1 -0
- package/dist/index.cjs +14 -0
- package/dist/index.d.cts +5 -0
- package/dist/index.d.mts +5 -0
- package/dist/index.mjs +6 -0
- package/dist/models.cjs +155 -0
- package/dist/models.d.cts +8 -0
- package/dist/models.d.cts.map +1 -0
- package/dist/models.d.mts +8 -0
- package/dist/models.d.mts.map +1 -0
- package/dist/models.mjs +150 -0
- package/dist/models.mjs.map +1 -0
- package/dist/models2.cjs +97 -0
- package/dist/models2.mjs +96 -0
- package/dist/models2.mjs.map +1 -0
- package/dist/normalize.cjs +49 -0
- package/dist/normalize.d.cts +10 -0
- package/dist/normalize.d.cts.map +1 -0
- package/dist/normalize.d.mts +10 -0
- package/dist/normalize.d.mts.map +1 -0
- package/dist/normalize.mjs +47 -0
- package/dist/normalize.mjs.map +1 -0
- package/dist/types.cjs +80 -0
- package/dist/types.d.cts +104 -0
- package/dist/types.d.cts.map +1 -0
- package/dist/types.d.mts +104 -0
- package/dist/types.d.mts.map +1 -0
- package/dist/types.mjs +77 -0
- package/dist/types.mjs.map +1 -0
- package/manifest.json +40 -0
- package/models.json +145 -0
- package/package.json +61 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { AFSAIGatewayOptionsInput } from "./types.cjs";
|
|
2
|
+
import { toCanonicalModel } from "./normalize.cjs";
|
|
3
|
+
import { AFSBaseProvider, AFSEntry, AFSExecResult, AFSExplainResult, AFSStatResult, ProviderManifest, ProviderTreeSchema, RouteContext } from "@aigne/afs";
|
|
4
|
+
|
|
5
|
+
//#region src/ai-gateway.d.ts
|
|
6
|
+
declare class AFSAIGateway extends AFSBaseProvider {
|
|
7
|
+
readonly name: string;
|
|
8
|
+
readonly description?: string;
|
|
9
|
+
readonly accessMode: "readwrite";
|
|
10
|
+
private readonly apiKey;
|
|
11
|
+
private readonly baseURL;
|
|
12
|
+
private readonly extraHeaders;
|
|
13
|
+
private readonly listStrategy;
|
|
14
|
+
private readonly defaultVendor;
|
|
15
|
+
private readonly endpointTimeoutMs;
|
|
16
|
+
/**
|
|
17
|
+
* The fallback catalog used (a) directly in bundled mode and (b) when the
|
|
18
|
+
* endpoint fetch fails in endpoint mode.
|
|
19
|
+
*/
|
|
20
|
+
private readonly fallbackModels;
|
|
21
|
+
/**
|
|
22
|
+
* Current resolved catalog. For `bundled` this is just `fallbackModels`.
|
|
23
|
+
* For `endpoint` this is `null` until the first fetch completes; subsequent
|
|
24
|
+
* access goes through `ensureModelsLoaded()`.
|
|
25
|
+
*/
|
|
26
|
+
private cachedModels;
|
|
27
|
+
/** De-duplicate concurrent endpoint fetches. */
|
|
28
|
+
private loadInflight;
|
|
29
|
+
private readonly chatCache;
|
|
30
|
+
private readonly embedCache;
|
|
31
|
+
constructor(options: AFSAIGatewayOptionsInput);
|
|
32
|
+
/** Getter for current models — lazy resolves endpoint strategy on first read. */
|
|
33
|
+
private ensureModelsLoaded;
|
|
34
|
+
private loadFromEndpoint;
|
|
35
|
+
/** Synchronous read — for routes that need the list right now. */
|
|
36
|
+
private get models();
|
|
37
|
+
static manifest(): ProviderManifest;
|
|
38
|
+
static treeSchema(): ProviderTreeSchema;
|
|
39
|
+
private findModel;
|
|
40
|
+
private openAIClientOptions;
|
|
41
|
+
private getChatClient;
|
|
42
|
+
private getEmbedClient;
|
|
43
|
+
listRoot(_ctx: RouteContext): Promise<{
|
|
44
|
+
data: AFSEntry[];
|
|
45
|
+
}>;
|
|
46
|
+
readRoot(_ctx: RouteContext): Promise<AFSEntry>;
|
|
47
|
+
rootMeta(_ctx: RouteContext): Promise<AFSEntry>;
|
|
48
|
+
statRoot(_ctx: RouteContext): Promise<AFSStatResult>;
|
|
49
|
+
readCapabilities(_ctx: RouteContext): Promise<AFSEntry>;
|
|
50
|
+
explainRoot(_ctx: RouteContext): Promise<AFSExplainResult>;
|
|
51
|
+
listRootActions(_ctx: RouteContext): Promise<{
|
|
52
|
+
data: AFSEntry[];
|
|
53
|
+
}>;
|
|
54
|
+
execListModels(_ctx: RouteContext, args: Record<string, unknown>): Promise<AFSExecResult>;
|
|
55
|
+
execRefresh(): Promise<AFSExecResult>;
|
|
56
|
+
listModels(_ctx: RouteContext): Promise<{
|
|
57
|
+
data: AFSEntry[];
|
|
58
|
+
}>;
|
|
59
|
+
readModels(_ctx: RouteContext): Promise<AFSEntry>;
|
|
60
|
+
metaModels(_ctx: RouteContext): Promise<AFSEntry>;
|
|
61
|
+
statModels(_ctx: RouteContext): Promise<AFSStatResult>;
|
|
62
|
+
listModel(ctx: RouteContext<{
|
|
63
|
+
canonical: string;
|
|
64
|
+
}>): Promise<{
|
|
65
|
+
data: AFSEntry[];
|
|
66
|
+
}>;
|
|
67
|
+
readModel(ctx: RouteContext<{
|
|
68
|
+
canonical: string;
|
|
69
|
+
}>): Promise<AFSEntry>;
|
|
70
|
+
metaModel(ctx: RouteContext<{
|
|
71
|
+
canonical: string;
|
|
72
|
+
}>): Promise<AFSEntry>;
|
|
73
|
+
statModel(ctx: RouteContext<{
|
|
74
|
+
canonical: string;
|
|
75
|
+
}>): Promise<AFSStatResult>;
|
|
76
|
+
explainModel(ctx: RouteContext<{
|
|
77
|
+
canonical: string;
|
|
78
|
+
}>): Promise<AFSExplainResult>;
|
|
79
|
+
listModelActions(ctx: RouteContext<{
|
|
80
|
+
canonical: string;
|
|
81
|
+
}>): Promise<{
|
|
82
|
+
data: AFSEntry[];
|
|
83
|
+
}>;
|
|
84
|
+
execChat(ctx: RouteContext<{
|
|
85
|
+
canonical: string;
|
|
86
|
+
}>, args: Record<string, unknown>): Promise<AFSExecResult>;
|
|
87
|
+
/**
|
|
88
|
+
* Drive a streaming chat completion, relaying text/thoughts deltas to
|
|
89
|
+
* `onChunk`, and return the fully-merged `ChatModelOutput` (identical to the
|
|
90
|
+
* buffered `invoke()` result). Runtime-agnostic: uses `getReader()` so it
|
|
91
|
+
* runs on the Cloudflare workerd isolate as well as Node.
|
|
92
|
+
*/
|
|
93
|
+
private streamChat;
|
|
94
|
+
/**
|
|
95
|
+
* Raw HTTP fetch path for Anthropic models that carry prompt-cache markers.
|
|
96
|
+
* Bypasses OpenAIChatModel.contentsFromInputMessages so cache_control is not
|
|
97
|
+
* stripped before it reaches the gateway / Anthropic API. Handles both
|
|
98
|
+
* buffered and SSE-streaming modes.
|
|
99
|
+
*/
|
|
100
|
+
private rawChatFetch;
|
|
101
|
+
/** Consume an OpenAI-compat SSE stream, forwarding text deltas via onChunk. */
|
|
102
|
+
private streamRawChat;
|
|
103
|
+
/**
|
|
104
|
+
* Build the `/.actions/chat` result `data` from a `ChatModelOutput`. Shared
|
|
105
|
+
* by the buffered and streaming paths so they can never drift. Forwards
|
|
106
|
+
* structured-output JSON + reasoning trace + tool calls + usage (without
|
|
107
|
+
* this, callers using `responseFormat: { type: "json_schema" }` lose the
|
|
108
|
+
* parsed object — caused scan-spam to log `"reason": "no result"`).
|
|
109
|
+
*/
|
|
110
|
+
private buildChatData;
|
|
111
|
+
execEmbed(ctx: RouteContext<{
|
|
112
|
+
canonical: string;
|
|
113
|
+
}>, args: Record<string, unknown>): Promise<AFSExecResult>;
|
|
114
|
+
execGenerateImage(ctx: RouteContext<{
|
|
115
|
+
canonical: string;
|
|
116
|
+
}>): Promise<AFSExecResult>;
|
|
117
|
+
execGenerateVideo(ctx: RouteContext<{
|
|
118
|
+
canonical: string;
|
|
119
|
+
}>): Promise<AFSExecResult>;
|
|
120
|
+
private buildMessages;
|
|
121
|
+
}
|
|
122
|
+
//#endregion
|
|
123
|
+
export { AFSAIGateway };
|
|
124
|
+
//# sourceMappingURL=ai-gateway.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-gateway.d.cts","names":[],"sources":["../src/ai-gateway.ts"],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { AFSAIGatewayOptionsInput } from "./types.mjs";
|
|
2
|
+
import { toCanonicalModel } from "./normalize.mjs";
|
|
3
|
+
import { AFSBaseProvider, AFSEntry, AFSExecResult, AFSExplainResult, AFSStatResult, ProviderManifest, ProviderTreeSchema, RouteContext } from "@aigne/afs";
|
|
4
|
+
|
|
5
|
+
//#region src/ai-gateway.d.ts
|
|
6
|
+
declare class AFSAIGateway extends AFSBaseProvider {
|
|
7
|
+
readonly name: string;
|
|
8
|
+
readonly description?: string;
|
|
9
|
+
readonly accessMode: "readwrite";
|
|
10
|
+
private readonly apiKey;
|
|
11
|
+
private readonly baseURL;
|
|
12
|
+
private readonly extraHeaders;
|
|
13
|
+
private readonly listStrategy;
|
|
14
|
+
private readonly defaultVendor;
|
|
15
|
+
private readonly endpointTimeoutMs;
|
|
16
|
+
/**
|
|
17
|
+
* The fallback catalog used (a) directly in bundled mode and (b) when the
|
|
18
|
+
* endpoint fetch fails in endpoint mode.
|
|
19
|
+
*/
|
|
20
|
+
private readonly fallbackModels;
|
|
21
|
+
/**
|
|
22
|
+
* Current resolved catalog. For `bundled` this is just `fallbackModels`.
|
|
23
|
+
* For `endpoint` this is `null` until the first fetch completes; subsequent
|
|
24
|
+
* access goes through `ensureModelsLoaded()`.
|
|
25
|
+
*/
|
|
26
|
+
private cachedModels;
|
|
27
|
+
/** De-duplicate concurrent endpoint fetches. */
|
|
28
|
+
private loadInflight;
|
|
29
|
+
private readonly chatCache;
|
|
30
|
+
private readonly embedCache;
|
|
31
|
+
constructor(options: AFSAIGatewayOptionsInput);
|
|
32
|
+
/** Getter for current models — lazy resolves endpoint strategy on first read. */
|
|
33
|
+
private ensureModelsLoaded;
|
|
34
|
+
private loadFromEndpoint;
|
|
35
|
+
/** Synchronous read — for routes that need the list right now. */
|
|
36
|
+
private get models();
|
|
37
|
+
static manifest(): ProviderManifest;
|
|
38
|
+
static treeSchema(): ProviderTreeSchema;
|
|
39
|
+
private findModel;
|
|
40
|
+
private openAIClientOptions;
|
|
41
|
+
private getChatClient;
|
|
42
|
+
private getEmbedClient;
|
|
43
|
+
listRoot(_ctx: RouteContext): Promise<{
|
|
44
|
+
data: AFSEntry[];
|
|
45
|
+
}>;
|
|
46
|
+
readRoot(_ctx: RouteContext): Promise<AFSEntry>;
|
|
47
|
+
rootMeta(_ctx: RouteContext): Promise<AFSEntry>;
|
|
48
|
+
statRoot(_ctx: RouteContext): Promise<AFSStatResult>;
|
|
49
|
+
readCapabilities(_ctx: RouteContext): Promise<AFSEntry>;
|
|
50
|
+
explainRoot(_ctx: RouteContext): Promise<AFSExplainResult>;
|
|
51
|
+
listRootActions(_ctx: RouteContext): Promise<{
|
|
52
|
+
data: AFSEntry[];
|
|
53
|
+
}>;
|
|
54
|
+
execListModels(_ctx: RouteContext, args: Record<string, unknown>): Promise<AFSExecResult>;
|
|
55
|
+
execRefresh(): Promise<AFSExecResult>;
|
|
56
|
+
listModels(_ctx: RouteContext): Promise<{
|
|
57
|
+
data: AFSEntry[];
|
|
58
|
+
}>;
|
|
59
|
+
readModels(_ctx: RouteContext): Promise<AFSEntry>;
|
|
60
|
+
metaModels(_ctx: RouteContext): Promise<AFSEntry>;
|
|
61
|
+
statModels(_ctx: RouteContext): Promise<AFSStatResult>;
|
|
62
|
+
listModel(ctx: RouteContext<{
|
|
63
|
+
canonical: string;
|
|
64
|
+
}>): Promise<{
|
|
65
|
+
data: AFSEntry[];
|
|
66
|
+
}>;
|
|
67
|
+
readModel(ctx: RouteContext<{
|
|
68
|
+
canonical: string;
|
|
69
|
+
}>): Promise<AFSEntry>;
|
|
70
|
+
metaModel(ctx: RouteContext<{
|
|
71
|
+
canonical: string;
|
|
72
|
+
}>): Promise<AFSEntry>;
|
|
73
|
+
statModel(ctx: RouteContext<{
|
|
74
|
+
canonical: string;
|
|
75
|
+
}>): Promise<AFSStatResult>;
|
|
76
|
+
explainModel(ctx: RouteContext<{
|
|
77
|
+
canonical: string;
|
|
78
|
+
}>): Promise<AFSExplainResult>;
|
|
79
|
+
listModelActions(ctx: RouteContext<{
|
|
80
|
+
canonical: string;
|
|
81
|
+
}>): Promise<{
|
|
82
|
+
data: AFSEntry[];
|
|
83
|
+
}>;
|
|
84
|
+
execChat(ctx: RouteContext<{
|
|
85
|
+
canonical: string;
|
|
86
|
+
}>, args: Record<string, unknown>): Promise<AFSExecResult>;
|
|
87
|
+
/**
|
|
88
|
+
* Drive a streaming chat completion, relaying text/thoughts deltas to
|
|
89
|
+
* `onChunk`, and return the fully-merged `ChatModelOutput` (identical to the
|
|
90
|
+
* buffered `invoke()` result). Runtime-agnostic: uses `getReader()` so it
|
|
91
|
+
* runs on the Cloudflare workerd isolate as well as Node.
|
|
92
|
+
*/
|
|
93
|
+
private streamChat;
|
|
94
|
+
/**
|
|
95
|
+
* Raw HTTP fetch path for Anthropic models that carry prompt-cache markers.
|
|
96
|
+
* Bypasses OpenAIChatModel.contentsFromInputMessages so cache_control is not
|
|
97
|
+
* stripped before it reaches the gateway / Anthropic API. Handles both
|
|
98
|
+
* buffered and SSE-streaming modes.
|
|
99
|
+
*/
|
|
100
|
+
private rawChatFetch;
|
|
101
|
+
/** Consume an OpenAI-compat SSE stream, forwarding text deltas via onChunk. */
|
|
102
|
+
private streamRawChat;
|
|
103
|
+
/**
|
|
104
|
+
* Build the `/.actions/chat` result `data` from a `ChatModelOutput`. Shared
|
|
105
|
+
* by the buffered and streaming paths so they can never drift. Forwards
|
|
106
|
+
* structured-output JSON + reasoning trace + tool calls + usage (without
|
|
107
|
+
* this, callers using `responseFormat: { type: "json_schema" }` lose the
|
|
108
|
+
* parsed object — caused scan-spam to log `"reason": "no result"`).
|
|
109
|
+
*/
|
|
110
|
+
private buildChatData;
|
|
111
|
+
execEmbed(ctx: RouteContext<{
|
|
112
|
+
canonical: string;
|
|
113
|
+
}>, args: Record<string, unknown>): Promise<AFSExecResult>;
|
|
114
|
+
execGenerateImage(ctx: RouteContext<{
|
|
115
|
+
canonical: string;
|
|
116
|
+
}>): Promise<AFSExecResult>;
|
|
117
|
+
execGenerateVideo(ctx: RouteContext<{
|
|
118
|
+
canonical: string;
|
|
119
|
+
}>): Promise<AFSExecResult>;
|
|
120
|
+
private buildMessages;
|
|
121
|
+
}
|
|
122
|
+
//#endregion
|
|
123
|
+
export { AFSAIGateway };
|
|
124
|
+
//# sourceMappingURL=ai-gateway.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-gateway.d.mts","names":[],"sources":["../src/ai-gateway.ts"],"mappings":"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"}
|