@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.
Files changed (42) hide show
  1. package/LICENSE.md +26 -0
  2. package/dist/_virtual/_@oxc-project_runtime@0.108.0/helpers/decorate.cjs +11 -0
  3. package/dist/_virtual/_@oxc-project_runtime@0.108.0/helpers/decorate.mjs +10 -0
  4. package/dist/_virtual/rolldown_runtime.cjs +29 -0
  5. package/dist/ai-gateway.cjs +1083 -0
  6. package/dist/ai-gateway.d.cts +124 -0
  7. package/dist/ai-gateway.d.cts.map +1 -0
  8. package/dist/ai-gateway.d.mts +124 -0
  9. package/dist/ai-gateway.d.mts.map +1 -0
  10. package/dist/ai-gateway.mjs +1083 -0
  11. package/dist/ai-gateway.mjs.map +1 -0
  12. package/dist/index.cjs +14 -0
  13. package/dist/index.d.cts +5 -0
  14. package/dist/index.d.mts +5 -0
  15. package/dist/index.mjs +6 -0
  16. package/dist/models.cjs +155 -0
  17. package/dist/models.d.cts +8 -0
  18. package/dist/models.d.cts.map +1 -0
  19. package/dist/models.d.mts +8 -0
  20. package/dist/models.d.mts.map +1 -0
  21. package/dist/models.mjs +150 -0
  22. package/dist/models.mjs.map +1 -0
  23. package/dist/models2.cjs +97 -0
  24. package/dist/models2.mjs +96 -0
  25. package/dist/models2.mjs.map +1 -0
  26. package/dist/normalize.cjs +49 -0
  27. package/dist/normalize.d.cts +10 -0
  28. package/dist/normalize.d.cts.map +1 -0
  29. package/dist/normalize.d.mts +10 -0
  30. package/dist/normalize.d.mts.map +1 -0
  31. package/dist/normalize.mjs +47 -0
  32. package/dist/normalize.mjs.map +1 -0
  33. package/dist/types.cjs +80 -0
  34. package/dist/types.d.cts +104 -0
  35. package/dist/types.d.cts.map +1 -0
  36. package/dist/types.d.mts +104 -0
  37. package/dist/types.d.mts.map +1 -0
  38. package/dist/types.mjs +77 -0
  39. package/dist/types.mjs.map +1 -0
  40. package/manifest.json +40 -0
  41. package/models.json +145 -0
  42. 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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"}