@f5-sales-demo/pi-ai 19.51.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 (128) hide show
  1. package/CHANGELOG.md +1997 -0
  2. package/README.md +1160 -0
  3. package/package.json +135 -0
  4. package/src/api-registry.ts +95 -0
  5. package/src/auth-storage.ts +2694 -0
  6. package/src/cli.ts +493 -0
  7. package/src/index.ts +42 -0
  8. package/src/model-cache.ts +97 -0
  9. package/src/model-manager.ts +349 -0
  10. package/src/model-thinking.ts +561 -0
  11. package/src/models.json +49439 -0
  12. package/src/models.json.d.ts +9 -0
  13. package/src/models.ts +56 -0
  14. package/src/prompts/turn-aborted-guidance.md +4 -0
  15. package/src/provider-details.ts +81 -0
  16. package/src/provider-models/descriptors.ts +285 -0
  17. package/src/provider-models/google.ts +90 -0
  18. package/src/provider-models/index.ts +4 -0
  19. package/src/provider-models/openai-compat.ts +2074 -0
  20. package/src/provider-models/special.ts +106 -0
  21. package/src/providers/amazon-bedrock.ts +706 -0
  22. package/src/providers/anthropic.ts +1682 -0
  23. package/src/providers/azure-openai-responses.ts +391 -0
  24. package/src/providers/cursor/gen/agent_pb.ts +15274 -0
  25. package/src/providers/cursor/proto/agent.proto +3526 -0
  26. package/src/providers/cursor/proto/buf.gen.yaml +6 -0
  27. package/src/providers/cursor/proto/buf.yaml +17 -0
  28. package/src/providers/cursor.ts +2218 -0
  29. package/src/providers/github-copilot-headers.ts +140 -0
  30. package/src/providers/gitlab-duo.ts +381 -0
  31. package/src/providers/google-gemini-cli.ts +1133 -0
  32. package/src/providers/google-shared.ts +354 -0
  33. package/src/providers/google-vertex.ts +436 -0
  34. package/src/providers/google.ts +381 -0
  35. package/src/providers/kimi.ts +151 -0
  36. package/src/providers/openai-codex/constants.ts +43 -0
  37. package/src/providers/openai-codex/request-transformer.ts +158 -0
  38. package/src/providers/openai-codex/response-handler.ts +81 -0
  39. package/src/providers/openai-codex-responses.ts +2345 -0
  40. package/src/providers/openai-completions-compat.ts +159 -0
  41. package/src/providers/openai-completions.ts +1290 -0
  42. package/src/providers/openai-responses-shared.ts +452 -0
  43. package/src/providers/openai-responses.ts +519 -0
  44. package/src/providers/register-builtins.ts +329 -0
  45. package/src/providers/synthetic.ts +154 -0
  46. package/src/providers/transform-messages.ts +234 -0
  47. package/src/rate-limit-utils.ts +84 -0
  48. package/src/stream.ts +728 -0
  49. package/src/types.ts +546 -0
  50. package/src/usage/claude.ts +337 -0
  51. package/src/usage/gemini.ts +248 -0
  52. package/src/usage/github-copilot.ts +421 -0
  53. package/src/usage/google-antigravity.ts +200 -0
  54. package/src/usage/kimi.ts +286 -0
  55. package/src/usage/minimax-code.ts +31 -0
  56. package/src/usage/openai-codex.ts +387 -0
  57. package/src/usage/zai.ts +247 -0
  58. package/src/usage.ts +130 -0
  59. package/src/utils/abort.ts +36 -0
  60. package/src/utils/anthropic-auth.ts +293 -0
  61. package/src/utils/discovery/antigravity.ts +261 -0
  62. package/src/utils/discovery/codex.ts +371 -0
  63. package/src/utils/discovery/cursor.ts +306 -0
  64. package/src/utils/discovery/gemini.ts +248 -0
  65. package/src/utils/discovery/index.ts +5 -0
  66. package/src/utils/discovery/openai-compatible.ts +224 -0
  67. package/src/utils/event-stream.ts +209 -0
  68. package/src/utils/http-inspector.ts +165 -0
  69. package/src/utils/idle-iterator.ts +176 -0
  70. package/src/utils/json-parse.ts +28 -0
  71. package/src/utils/oauth/alibaba-coding-plan.ts +59 -0
  72. package/src/utils/oauth/anthropic.ts +134 -0
  73. package/src/utils/oauth/api-key-validation.ts +92 -0
  74. package/src/utils/oauth/callback-server.ts +276 -0
  75. package/src/utils/oauth/cerebras.ts +59 -0
  76. package/src/utils/oauth/cloudflare-ai-gateway.ts +48 -0
  77. package/src/utils/oauth/cursor.ts +157 -0
  78. package/src/utils/oauth/github-copilot.ts +358 -0
  79. package/src/utils/oauth/gitlab-duo.ts +123 -0
  80. package/src/utils/oauth/google-antigravity.ts +275 -0
  81. package/src/utils/oauth/google-gemini-cli.ts +334 -0
  82. package/src/utils/oauth/huggingface.ts +62 -0
  83. package/src/utils/oauth/index.ts +512 -0
  84. package/src/utils/oauth/kagi.ts +47 -0
  85. package/src/utils/oauth/kilo.ts +87 -0
  86. package/src/utils/oauth/kimi.ts +251 -0
  87. package/src/utils/oauth/litellm.ts +81 -0
  88. package/src/utils/oauth/lm-studio.ts +40 -0
  89. package/src/utils/oauth/minimax-code.ts +78 -0
  90. package/src/utils/oauth/moonshot.ts +59 -0
  91. package/src/utils/oauth/nanogpt.ts +51 -0
  92. package/src/utils/oauth/nvidia.ts +70 -0
  93. package/src/utils/oauth/oauth.html +199 -0
  94. package/src/utils/oauth/ollama.ts +47 -0
  95. package/src/utils/oauth/openai-codex.ts +190 -0
  96. package/src/utils/oauth/opencode.ts +49 -0
  97. package/src/utils/oauth/parallel.ts +46 -0
  98. package/src/utils/oauth/perplexity.ts +200 -0
  99. package/src/utils/oauth/pkce.ts +18 -0
  100. package/src/utils/oauth/qianfan.ts +58 -0
  101. package/src/utils/oauth/qwen-portal.ts +60 -0
  102. package/src/utils/oauth/synthetic.ts +60 -0
  103. package/src/utils/oauth/tavily.ts +46 -0
  104. package/src/utils/oauth/together.ts +59 -0
  105. package/src/utils/oauth/types.ts +89 -0
  106. package/src/utils/oauth/venice.ts +59 -0
  107. package/src/utils/oauth/vercel-ai-gateway.ts +47 -0
  108. package/src/utils/oauth/vllm.ts +40 -0
  109. package/src/utils/oauth/xiaomi.ts +88 -0
  110. package/src/utils/oauth/zai.ts +60 -0
  111. package/src/utils/oauth/zenmux.ts +51 -0
  112. package/src/utils/overflow.ts +134 -0
  113. package/src/utils/retry-after.ts +110 -0
  114. package/src/utils/retry.ts +93 -0
  115. package/src/utils/schema/CONSTRAINTS.md +160 -0
  116. package/src/utils/schema/adapt.ts +20 -0
  117. package/src/utils/schema/compatibility.ts +397 -0
  118. package/src/utils/schema/dereference.ts +93 -0
  119. package/src/utils/schema/equality.ts +93 -0
  120. package/src/utils/schema/fields.ts +147 -0
  121. package/src/utils/schema/index.ts +9 -0
  122. package/src/utils/schema/normalize-cca.ts +479 -0
  123. package/src/utils/schema/sanitize-google.ts +212 -0
  124. package/src/utils/schema/strict-mode.ts +385 -0
  125. package/src/utils/schema/types.ts +5 -0
  126. package/src/utils/tool-choice.ts +81 -0
  127. package/src/utils/validation.ts +664 -0
  128. package/src/utils.ts +147 -0
@@ -0,0 +1,329 @@
1
+ /**
2
+ * Lazy provider module loading.
3
+ *
4
+ * Each provider module is loaded only when its stream function is first called.
5
+ * This avoids eagerly importing heavy SDK dependencies (e.g., @anthropic-ai/sdk,
6
+ * openai) at startup. The loaded module promise is cached so subsequent calls
7
+ * reuse the same import.
8
+ *
9
+ * NOTE: stream.ts currently imports providers directly, so this file is not yet
10
+ * wired into the main streaming path. It provides the infrastructure for lazy
11
+ * loading that can be integrated when stream.ts is refactored.
12
+ */
13
+ import type {
14
+ Api,
15
+ AssistantMessage,
16
+ AssistantMessageEvent,
17
+ AssistantMessageEventStream,
18
+ Context,
19
+ Model,
20
+ OptionsForApi,
21
+ } from "../types";
22
+ import { AssistantMessageEventStream as EventStreamImpl } from "../utils/event-stream";
23
+ import type { BedrockOptions } from "./amazon-bedrock";
24
+ import type { AnthropicOptions } from "./anthropic";
25
+ import type { AzureOpenAIResponsesOptions } from "./azure-openai-responses";
26
+ import type { CursorOptions } from "./cursor";
27
+ import type { GoogleOptions } from "./google";
28
+ import type { GoogleGeminiCliOptions } from "./google-gemini-cli";
29
+ import type { GoogleVertexOptions } from "./google-vertex";
30
+ import type { OpenAICodexResponsesOptions } from "./openai-codex-responses";
31
+ import type { OpenAICompletionsOptions } from "./openai-completions";
32
+ import type { OpenAIResponsesOptions } from "./openai-responses";
33
+
34
+ // ---------------------------------------------------------------------------
35
+ // Lazy provider module shape
36
+ // ---------------------------------------------------------------------------
37
+
38
+ interface LazyProviderModule<TApi extends Api> {
39
+ stream: (model: Model<TApi>, context: Context, options: OptionsForApi<TApi>) => AsyncIterable<AssistantMessageEvent>;
40
+ }
41
+
42
+ interface AnthropicProviderModule {
43
+ streamAnthropic: (
44
+ model: Model<"anthropic-messages">,
45
+ context: Context,
46
+ options: AnthropicOptions,
47
+ ) => AssistantMessageEventStream;
48
+ }
49
+
50
+ interface AzureOpenAIResponsesProviderModule {
51
+ streamAzureOpenAIResponses: (
52
+ model: Model<"azure-openai-responses">,
53
+ context: Context,
54
+ options: AzureOpenAIResponsesOptions,
55
+ ) => AssistantMessageEventStream;
56
+ }
57
+
58
+ interface GoogleProviderModule {
59
+ streamGoogle: (
60
+ model: Model<"google-generative-ai">,
61
+ context: Context,
62
+ options: GoogleOptions,
63
+ ) => AssistantMessageEventStream;
64
+ }
65
+
66
+ interface GoogleGeminiCliProviderModule {
67
+ streamGoogleGeminiCli: (
68
+ model: Model<"google-gemini-cli">,
69
+ context: Context,
70
+ options: GoogleGeminiCliOptions,
71
+ ) => AssistantMessageEventStream;
72
+ }
73
+
74
+ interface GoogleVertexProviderModule {
75
+ streamGoogleVertex: (
76
+ model: Model<"google-vertex">,
77
+ context: Context,
78
+ options: GoogleVertexOptions,
79
+ ) => AssistantMessageEventStream;
80
+ }
81
+
82
+ interface OpenAICodexResponsesProviderModule {
83
+ streamOpenAICodexResponses: (
84
+ model: Model<"openai-codex-responses">,
85
+ context: Context,
86
+ options: OpenAICodexResponsesOptions,
87
+ ) => AssistantMessageEventStream;
88
+ }
89
+
90
+ interface OpenAICompletionsProviderModule {
91
+ streamOpenAICompletions: (
92
+ model: Model<"openai-completions">,
93
+ context: Context,
94
+ options: OpenAICompletionsOptions,
95
+ ) => AssistantMessageEventStream;
96
+ }
97
+
98
+ interface OpenAIResponsesProviderModule {
99
+ streamOpenAIResponses: (
100
+ model: Model<"openai-responses">,
101
+ context: Context,
102
+ options: OpenAIResponsesOptions,
103
+ ) => AssistantMessageEventStream;
104
+ }
105
+
106
+ interface CursorProviderModule {
107
+ streamCursor: (
108
+ model: Model<"cursor-agent">,
109
+ context: Context,
110
+ options: CursorOptions,
111
+ ) => AssistantMessageEventStream;
112
+ }
113
+
114
+ interface BedrockProviderModule {
115
+ streamBedrock: (
116
+ model: Model<"bedrock-converse-stream">,
117
+ context: Context,
118
+ options: BedrockOptions,
119
+ ) => AssistantMessageEventStream;
120
+ }
121
+
122
+ // ---------------------------------------------------------------------------
123
+ // Module-level lazy promise caches
124
+ // ---------------------------------------------------------------------------
125
+
126
+ const importNodeOnlyProvider = (specifier: string): Promise<unknown> => import(specifier);
127
+
128
+ let anthropicProviderModulePromise: Promise<LazyProviderModule<"anthropic-messages">> | undefined;
129
+ let azureOpenAIResponsesProviderModulePromise: Promise<LazyProviderModule<"azure-openai-responses">> | undefined;
130
+ let googleProviderModulePromise: Promise<LazyProviderModule<"google-generative-ai">> | undefined;
131
+ let googleGeminiCliProviderModulePromise: Promise<LazyProviderModule<"google-gemini-cli">> | undefined;
132
+ let googleVertexProviderModulePromise: Promise<LazyProviderModule<"google-vertex">> | undefined;
133
+ let openAICodexResponsesProviderModulePromise: Promise<LazyProviderModule<"openai-codex-responses">> | undefined;
134
+ let openAICompletionsProviderModulePromise: Promise<LazyProviderModule<"openai-completions">> | undefined;
135
+ let openAIResponsesProviderModulePromise: Promise<LazyProviderModule<"openai-responses">> | undefined;
136
+ let cursorProviderModulePromise: Promise<LazyProviderModule<"cursor-agent">> | undefined;
137
+ let bedrockProviderModuleOverride: LazyProviderModule<"bedrock-converse-stream"> | undefined;
138
+ let bedrockProviderModulePromise: Promise<LazyProviderModule<"bedrock-converse-stream">> | undefined;
139
+
140
+ export function setBedrockProviderModule(module: BedrockProviderModule): void {
141
+ bedrockProviderModuleOverride = {
142
+ stream: module.streamBedrock,
143
+ };
144
+ }
145
+
146
+ // ---------------------------------------------------------------------------
147
+ // Stream forwarding / error helpers
148
+ // ---------------------------------------------------------------------------
149
+
150
+ function hasFinalResult(
151
+ source: AsyncIterable<AssistantMessageEvent>,
152
+ ): source is AsyncIterable<AssistantMessageEvent> & { result(): Promise<AssistantMessage> } {
153
+ return typeof (source as { result?: unknown }).result === "function";
154
+ }
155
+
156
+ function forwardStream<TApi extends Api>(
157
+ target: EventStreamImpl,
158
+ source: AsyncIterable<AssistantMessageEvent>,
159
+ model: Model<TApi>,
160
+ ): void {
161
+ (async () => {
162
+ try {
163
+ for await (const event of source) {
164
+ target.push(event);
165
+ }
166
+ if (hasFinalResult(source)) {
167
+ target.end(await source.result());
168
+ } else {
169
+ target.end();
170
+ }
171
+ } catch (error) {
172
+ const message = createLazyLoadErrorMessage(model, error);
173
+ target.push({ type: "error", reason: "error", error: message });
174
+ target.end(message);
175
+ }
176
+ })();
177
+ }
178
+
179
+ function createLazyLoadErrorMessage<TApi extends Api>(model: Model<TApi>, error: unknown): AssistantMessage {
180
+ return {
181
+ role: "assistant",
182
+ content: [],
183
+ api: model.api,
184
+ provider: model.provider,
185
+ model: model.id,
186
+ usage: {
187
+ input: 0,
188
+ output: 0,
189
+ cacheRead: 0,
190
+ cacheWrite: 0,
191
+ totalTokens: 0,
192
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
193
+ },
194
+ stopReason: "error",
195
+ errorMessage: error instanceof Error ? error.message : String(error),
196
+ timestamp: Date.now(),
197
+ };
198
+ }
199
+
200
+ // ---------------------------------------------------------------------------
201
+ // Generic lazy stream factory
202
+ // ---------------------------------------------------------------------------
203
+
204
+ function createLazyStream<TApi extends Api>(
205
+ loadModule: () => Promise<LazyProviderModule<TApi>>,
206
+ ): (model: Model<TApi>, context: Context, options: OptionsForApi<TApi>) => EventStreamImpl {
207
+ return (model, context, options) => {
208
+ const outer = new EventStreamImpl();
209
+
210
+ loadModule()
211
+ .then(module => {
212
+ const inner = module.stream(model, context, options);
213
+ forwardStream(outer, inner, model);
214
+ })
215
+ .catch(error => {
216
+ const message = createLazyLoadErrorMessage(model, error);
217
+ outer.push({ type: "error", reason: "error", error: message });
218
+ outer.end(message);
219
+ });
220
+
221
+ return outer;
222
+ };
223
+ }
224
+
225
+ // ---------------------------------------------------------------------------
226
+ // Module loaders (one per provider, cached via ||=)
227
+ // ---------------------------------------------------------------------------
228
+
229
+ function loadAnthropicProviderModule(): Promise<LazyProviderModule<"anthropic-messages">> {
230
+ anthropicProviderModulePromise ||= import("./anthropic").then(module => {
231
+ const provider = module as AnthropicProviderModule;
232
+ return { stream: provider.streamAnthropic };
233
+ });
234
+ return anthropicProviderModulePromise;
235
+ }
236
+
237
+ function loadAzureOpenAIResponsesProviderModule(): Promise<LazyProviderModule<"azure-openai-responses">> {
238
+ azureOpenAIResponsesProviderModulePromise ||= import("./azure-openai-responses").then(module => {
239
+ const provider = module as AzureOpenAIResponsesProviderModule;
240
+ return { stream: provider.streamAzureOpenAIResponses };
241
+ });
242
+ return azureOpenAIResponsesProviderModulePromise;
243
+ }
244
+
245
+ function loadGoogleProviderModule(): Promise<LazyProviderModule<"google-generative-ai">> {
246
+ googleProviderModulePromise ||= import("./google").then(module => {
247
+ const provider = module as GoogleProviderModule;
248
+ return { stream: provider.streamGoogle };
249
+ });
250
+ return googleProviderModulePromise;
251
+ }
252
+
253
+ function loadGoogleGeminiCliProviderModule(): Promise<LazyProviderModule<"google-gemini-cli">> {
254
+ googleGeminiCliProviderModulePromise ||= import("./google-gemini-cli").then(module => {
255
+ const provider = module as GoogleGeminiCliProviderModule;
256
+ return { stream: provider.streamGoogleGeminiCli };
257
+ });
258
+ return googleGeminiCliProviderModulePromise;
259
+ }
260
+
261
+ function loadGoogleVertexProviderModule(): Promise<LazyProviderModule<"google-vertex">> {
262
+ googleVertexProviderModulePromise ||= import("./google-vertex").then(module => {
263
+ const provider = module as GoogleVertexProviderModule;
264
+ return { stream: provider.streamGoogleVertex };
265
+ });
266
+ return googleVertexProviderModulePromise;
267
+ }
268
+
269
+ function loadOpenAICodexResponsesProviderModule(): Promise<LazyProviderModule<"openai-codex-responses">> {
270
+ openAICodexResponsesProviderModulePromise ||= import("./openai-codex-responses").then(module => {
271
+ const provider = module as OpenAICodexResponsesProviderModule;
272
+ return { stream: provider.streamOpenAICodexResponses };
273
+ });
274
+ return openAICodexResponsesProviderModulePromise;
275
+ }
276
+
277
+ function loadOpenAICompletionsProviderModule(): Promise<LazyProviderModule<"openai-completions">> {
278
+ openAICompletionsProviderModulePromise ||= import("./openai-completions").then(module => {
279
+ const provider = module as OpenAICompletionsProviderModule;
280
+ return { stream: provider.streamOpenAICompletions };
281
+ });
282
+ return openAICompletionsProviderModulePromise;
283
+ }
284
+
285
+ function loadOpenAIResponsesProviderModule(): Promise<LazyProviderModule<"openai-responses">> {
286
+ openAIResponsesProviderModulePromise ||= import("./openai-responses").then(module => {
287
+ const provider = module as OpenAIResponsesProviderModule;
288
+ return { stream: provider.streamOpenAIResponses };
289
+ });
290
+ return openAIResponsesProviderModulePromise;
291
+ }
292
+
293
+ function loadCursorProviderModule(): Promise<LazyProviderModule<"cursor-agent">> {
294
+ cursorProviderModulePromise ||= import("./cursor").then(module => {
295
+ const provider = module as CursorProviderModule;
296
+ return { stream: provider.streamCursor };
297
+ });
298
+ return cursorProviderModulePromise;
299
+ }
300
+
301
+ function loadBedrockProviderModule(): Promise<LazyProviderModule<"bedrock-converse-stream">> {
302
+ if (bedrockProviderModuleOverride) {
303
+ return Promise.resolve(bedrockProviderModuleOverride);
304
+ }
305
+ bedrockProviderModulePromise ||= importNodeOnlyProvider("./amazon-bedrock").then(module => {
306
+ const provider = module as BedrockProviderModule;
307
+ return { stream: provider.streamBedrock };
308
+ });
309
+ return bedrockProviderModulePromise;
310
+ }
311
+
312
+ // ---------------------------------------------------------------------------
313
+ // Lazy stream function exports
314
+ //
315
+ // These use the same names as the direct provider stream functions. When
316
+ // stream.ts is updated to import from this module instead of individual
317
+ // providers, the lazy loading will take effect on the main code path.
318
+ // ---------------------------------------------------------------------------
319
+
320
+ export const streamAnthropic = createLazyStream(loadAnthropicProviderModule);
321
+ export const streamAzureOpenAIResponses = createLazyStream(loadAzureOpenAIResponsesProviderModule);
322
+ export const streamGoogle = createLazyStream(loadGoogleProviderModule);
323
+ export const streamGoogleGeminiCli = createLazyStream(loadGoogleGeminiCliProviderModule);
324
+ export const streamGoogleVertex = createLazyStream(loadGoogleVertexProviderModule);
325
+ export const streamOpenAICodexResponses = createLazyStream(loadOpenAICodexResponsesProviderModule);
326
+ export const streamOpenAICompletions = createLazyStream(loadOpenAICompletionsProviderModule);
327
+ export const streamOpenAIResponses = createLazyStream(loadOpenAIResponsesProviderModule);
328
+ export const streamCursor = createLazyStream(loadCursorProviderModule);
329
+ export const streamBedrock = createLazyStream(loadBedrockProviderModule);
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Synthetic provider - wraps OpenAI or Anthropic API based on format setting.
3
+ *
4
+ * Synthetic offers both OpenAI-compatible and Anthropic-compatible APIs:
5
+ * - OpenAI: https://api.synthetic.new/openai/v1/chat/completions
6
+ * - Anthropic: https://api.synthetic.new/anthropic/v1/messages
7
+ *
8
+ * @see https://dev.synthetic.new/docs/api/overview
9
+ */
10
+
11
+ import { ANTHROPIC_THINKING } from "../stream";
12
+ import type { Api, Context, Model, SimpleStreamOptions } from "../types";
13
+ import { AssistantMessageEventStream } from "../utils/event-stream";
14
+ import { streamAnthropic } from "./anthropic";
15
+ import { streamOpenAICompletions } from "./openai-completions";
16
+
17
+ export type SyntheticApiFormat = "openai" | "anthropic";
18
+
19
+ const SYNTHETIC_NEW_BASE_URL = "https://api.synthetic.new/openai/v1";
20
+ const SYNTHETIC_NEW_ANTHROPIC_BASE_URL = "https://api.synthetic.new/anthropic";
21
+
22
+ export interface SyntheticOptions extends SimpleStreamOptions {
23
+ /** API format: "openai" or "anthropic". Default: "openai" */
24
+ format?: SyntheticApiFormat;
25
+ }
26
+
27
+ /**
28
+ * Stream from Synthetic, routing to either OpenAI or Anthropic API based on format.
29
+ * Returns synchronously like other providers - async processing happens internally.
30
+ */
31
+ export function streamSynthetic(
32
+ model: Model<"openai-completions">,
33
+ context: Context,
34
+ options?: SyntheticOptions,
35
+ ): AssistantMessageEventStream {
36
+ const stream = new AssistantMessageEventStream();
37
+ const format = options?.format ?? "openai";
38
+
39
+ // Async IIFE to handle stream piping
40
+ (async () => {
41
+ try {
42
+ const mergedHeaders = options?.headers ?? {};
43
+
44
+ if (format === "anthropic") {
45
+ // Create a synthetic Anthropic model pointing to Synthetic's endpoint
46
+ const anthropicModel: Model<"anthropic-messages"> = {
47
+ id: model.id,
48
+ name: model.name,
49
+ api: "anthropic-messages",
50
+ provider: model.provider,
51
+ baseUrl: SYNTHETIC_NEW_ANTHROPIC_BASE_URL,
52
+ headers: mergedHeaders,
53
+ contextWindow: model.contextWindow,
54
+ maxTokens: model.maxTokens,
55
+ reasoning: model.reasoning,
56
+ input: model.input,
57
+ cost: model.cost,
58
+ };
59
+
60
+ // Calculate thinking budget from reasoning level
61
+ const reasoning = options?.reasoning;
62
+ const reasoningEffort = reasoning;
63
+ const thinkingEnabled = !!reasoningEffort && model.reasoning;
64
+ const thinkingBudget = reasoningEffort
65
+ ? (options?.thinkingBudgets?.[reasoningEffort] ?? ANTHROPIC_THINKING[reasoningEffort])
66
+ : undefined;
67
+
68
+ const innerStream = streamAnthropic(anthropicModel, context, {
69
+ apiKey: options?.apiKey,
70
+ temperature: options?.temperature,
71
+ topP: options?.topP,
72
+ topK: options?.topK,
73
+ minP: options?.minP,
74
+ presencePenalty: options?.presencePenalty,
75
+ repetitionPenalty: options?.repetitionPenalty,
76
+ maxTokens: options?.maxTokens ?? Math.min(model.maxTokens, 32000),
77
+ signal: options?.signal,
78
+ headers: mergedHeaders,
79
+ sessionId: options?.sessionId,
80
+ onPayload: options?.onPayload,
81
+ thinkingEnabled,
82
+ thinkingBudgetTokens: thinkingBudget,
83
+ });
84
+
85
+ for await (const event of innerStream) {
86
+ stream.push(event);
87
+ }
88
+ } else {
89
+ // OpenAI format - use original model with Synthetic headers
90
+ const syntheticModel: Model<"openai-completions"> = {
91
+ ...model,
92
+ baseUrl: SYNTHETIC_NEW_BASE_URL,
93
+ headers: mergedHeaders,
94
+ };
95
+
96
+ const reasoningEffort = options?.reasoning;
97
+ const innerStream = streamOpenAICompletions(syntheticModel, context, {
98
+ apiKey: options?.apiKey,
99
+ temperature: options?.temperature,
100
+ topP: options?.topP,
101
+ topK: options?.topK,
102
+ minP: options?.minP,
103
+ presencePenalty: options?.presencePenalty,
104
+ repetitionPenalty: options?.repetitionPenalty,
105
+ maxTokens: options?.maxTokens ?? model.maxTokens,
106
+ signal: options?.signal,
107
+ headers: mergedHeaders,
108
+ sessionId: options?.sessionId,
109
+ onPayload: options?.onPayload,
110
+ reasoning: reasoningEffort,
111
+ });
112
+
113
+ for await (const event of innerStream) {
114
+ stream.push(event);
115
+ }
116
+ }
117
+ } catch (err) {
118
+ stream.push({
119
+ type: "error",
120
+ reason: "error",
121
+ error: createErrorMessage(model, err),
122
+ });
123
+ }
124
+ })();
125
+
126
+ return stream;
127
+ }
128
+
129
+ function createErrorMessage(model: Model<Api>, err: unknown) {
130
+ return {
131
+ role: "assistant" as const,
132
+ content: [{ type: "text" as const, text: err instanceof Error ? err.message : String(err) }],
133
+ api: model.api,
134
+ provider: model.provider,
135
+ model: model.id,
136
+ usage: {
137
+ input: 0,
138
+ output: 0,
139
+ cacheRead: 0,
140
+ cacheWrite: 0,
141
+ totalTokens: 0,
142
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
143
+ },
144
+ stopReason: "error" as const,
145
+ timestamp: Date.now(),
146
+ };
147
+ }
148
+
149
+ /**
150
+ * Check if a model is a Synthetic model.
151
+ */
152
+ export function isSyntheticModel(model: Model<Api>): boolean {
153
+ return model.provider === "synthetic";
154
+ }