@opencode/ai 2.0.21 → 2.0.23

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 (113) hide show
  1. package/README.md +61 -1
  2. package/dist/cache-policy.js +10 -2
  3. package/dist/llm.d.ts +4 -0
  4. package/dist/promise.d.ts +8 -0
  5. package/dist/protocols/alibaba-chat.d.ts +7 -3
  6. package/dist/protocols/alibaba-chat.js +2 -1
  7. package/dist/protocols/alibaba-responses.d.ts +16 -12
  8. package/dist/protocols/alibaba-responses.js +3 -5
  9. package/dist/protocols/anthropic-messages.js +58 -51
  10. package/dist/protocols/bedrock-converse.js +33 -4
  11. package/dist/protocols/cartesia-speech.js +3 -3
  12. package/dist/protocols/cohere-chat.d.ts +178 -0
  13. package/dist/protocols/cohere-chat.js +299 -0
  14. package/dist/protocols/elevenlabs-speech.js +3 -3
  15. package/dist/protocols/gemini.d.ts +2 -2
  16. package/dist/protocols/gemini.js +3 -3
  17. package/dist/protocols/google-interactions.d.ts +236 -0
  18. package/dist/protocols/google-interactions.js +478 -0
  19. package/dist/protocols/google-speech.js +1 -1
  20. package/dist/protocols/google-transcription.js +1 -1
  21. package/dist/protocols/index.d.ts +2 -0
  22. package/dist/protocols/index.js +2 -0
  23. package/dist/protocols/meta-responses.d.ts +31 -58
  24. package/dist/protocols/meta-responses.js +8 -27
  25. package/dist/protocols/mistral-chat.d.ts +24 -9
  26. package/dist/protocols/mistral-chat.js +22 -10
  27. package/dist/protocols/open-responses.d.ts +410 -91
  28. package/dist/protocols/open-responses.js +25 -15
  29. package/dist/protocols/openai-chat.d.ts +409 -5
  30. package/dist/protocols/openai-chat.js +27 -26
  31. package/dist/protocols/openai-compatible-chat.d.ts +1 -1
  32. package/dist/protocols/openai-compatible-responses.d.ts +16 -4
  33. package/dist/protocols/openai-images.js +2 -2
  34. package/dist/protocols/openai-responses.d.ts +87 -223
  35. package/dist/protocols/openai-responses.js +10 -16
  36. package/dist/protocols/openai-speech.js +1 -1
  37. package/dist/protocols/openai-transcription.js +1 -1
  38. package/dist/protocols/shared.js +2 -2
  39. package/dist/protocols/stability-images.js +1 -1
  40. package/dist/protocols/utils/bedrock-media.js +2 -2
  41. package/dist/protocols/utils/cache.d.ts +5 -0
  42. package/dist/protocols/utils/cache.js +9 -1
  43. package/dist/protocols/utils/responses-checkpoint.js +2 -2
  44. package/dist/protocols/utils/responses-hosted-tools.js +1 -1
  45. package/dist/protocols/utils/tool-stream.d.ts +12 -0
  46. package/dist/protocols/utils/tool-stream.js +15 -7
  47. package/dist/protocols/venice-chat.d.ts +280 -0
  48. package/dist/protocols/venice-chat.js +283 -0
  49. package/dist/protocols/xai-responses.d.ts +18 -21
  50. package/dist/protocols/xai-responses.js +2 -8
  51. package/dist/protocols/zai-chat.d.ts +7 -3
  52. package/dist/protocols/zai-chat.js +6 -3
  53. package/dist/provider-error.js +27 -7
  54. package/dist/providers/alibaba.d.ts +17 -13
  55. package/dist/providers/amazon-bedrock/mantle/messages.d.ts +2 -0
  56. package/dist/providers/amazon-bedrock/mantle/messages.js +1 -0
  57. package/dist/providers/amazon-bedrock-mantle.d.ts +301 -9
  58. package/dist/providers/amazon-bedrock-mantle.js +28 -3
  59. package/dist/providers/azure.d.ts +13 -61
  60. package/dist/providers/baseten.d.ts +2 -2
  61. package/dist/providers/cerebras.d.ts +2 -2
  62. package/dist/providers/cloudflare-ai-gateway.d.ts +14 -62
  63. package/dist/providers/cloudflare-workers-ai.d.ts +2 -2
  64. package/dist/providers/cohere/chat.d.ts +4 -0
  65. package/dist/providers/cohere/chat.js +8 -0
  66. package/dist/providers/cohere.d.ts +395 -0
  67. package/dist/providers/cohere.js +48 -0
  68. package/dist/providers/deepinfra.d.ts +2 -2
  69. package/dist/providers/deepseek.d.ts +2 -2
  70. package/dist/providers/digitalocean.d.ts +469 -0
  71. package/dist/providers/digitalocean.js +53 -0
  72. package/dist/providers/fireworks.d.ts +2 -2
  73. package/dist/providers/google/interactions.d.ts +7 -0
  74. package/dist/providers/google/interactions.js +8 -0
  75. package/dist/providers/google-vertex-chat.d.ts +1 -1
  76. package/dist/providers/google-vertex-messages.js +1 -1
  77. package/dist/providers/google-vertex-responses.d.ts +16 -4
  78. package/dist/providers/google-vertex.d.ts +1 -1
  79. package/dist/providers/google.d.ts +95 -4
  80. package/dist/providers/google.js +8 -1
  81. package/dist/providers/groq.d.ts +8 -4
  82. package/dist/providers/groq.js +1 -1
  83. package/dist/providers/index.d.ts +3 -0
  84. package/dist/providers/index.js +3 -0
  85. package/dist/providers/meta.d.ts +15 -28
  86. package/dist/providers/minimax.d.ts +17 -5
  87. package/dist/providers/mistral.d.ts +10 -4
  88. package/dist/providers/moonshot.d.ts +17 -5
  89. package/dist/providers/openai-compatible-responses.d.ts +16 -4
  90. package/dist/providers/openai-compatible.d.ts +1 -1
  91. package/dist/providers/openai-options.d.ts +1 -1
  92. package/dist/providers/openai.d.ts +7 -31
  93. package/dist/providers/openrouter.d.ts +9 -5
  94. package/dist/providers/openrouter.js +1 -13
  95. package/dist/providers/togetherai.d.ts +2 -2
  96. package/dist/providers/venice.d.ts +183 -0
  97. package/dist/providers/venice.js +38 -0
  98. package/dist/providers/xai.d.ts +1 -1
  99. package/dist/providers/zai-coding-plan.d.ts +17 -5
  100. package/dist/providers/zai.d.ts +1 -1
  101. package/dist/route/client.d.ts +4 -0
  102. package/dist/route/client.js +2 -5
  103. package/dist/route/executor.js +13 -6
  104. package/dist/route/framing.js +23 -23
  105. package/dist/route/transport/http.d.ts +2 -1
  106. package/dist/route/transport/http.js +28 -6
  107. package/dist/schema/events.d.ts +176 -0
  108. package/dist/schema/events.js +4 -0
  109. package/dist/schema/options.d.ts +11 -0
  110. package/dist/schema/options.js +15 -2
  111. package/dist/testing.d.ts +32 -0
  112. package/dist/tool-history.js +17 -3
  113. package/package.json +3 -3
@@ -1,6 +1,5 @@
1
1
  import { Schema } from "effect";
2
2
  import { Protocol } from "../route/protocol.js";
3
- import { HttpTransport } from "../route/transport/index.js";
4
3
  import { OpenResponses } from "./open-responses.js";
5
4
  export declare const WebSearch: Schema.Struct<{
6
5
  readonly type: Schema.Literal<"web_search">;
@@ -63,6 +62,15 @@ export declare const protocol: Protocol<{
63
62
  readonly error?: unknown;
64
63
  readonly arguments?: string | undefined;
65
64
  readonly server_label?: string | undefined;
65
+ } | {
66
+ readonly type: "configuration_update";
67
+ readonly reasoning: {
68
+ readonly effort: import("../schema/options.js").ReasoningEffort;
69
+ };
70
+ } | {
71
+ readonly [x: string]: unknown;
72
+ readonly type: string;
73
+ readonly id: string;
66
74
  } | {
67
75
  readonly type: "reasoning";
68
76
  readonly summary: readonly {
@@ -139,13 +147,6 @@ export declare const protocol: Protocol<{
139
147
  readonly type: "input_video";
140
148
  readonly video_url: string;
141
149
  })[];
142
- } | {
143
- readonly id: string;
144
- readonly type: "image_generation_call";
145
- readonly status?: string | undefined;
146
- readonly error?: unknown;
147
- readonly result?: string | null | undefined;
148
- readonly output_format?: string | undefined;
149
150
  })[];
150
151
  readonly model: string;
151
152
  readonly stream: true;
@@ -158,6 +159,9 @@ export declare const protocol: Protocol<{
158
159
  readonly effort?: import("../schema/options.js").ReasoningEffort | undefined;
159
160
  } | undefined;
160
161
  readonly tools?: readonly ({
162
+ readonly [x: string]: unknown;
163
+ readonly type: string;
164
+ } | {
161
165
  readonly type: "function";
162
166
  readonly description: string;
163
167
  readonly name: string;
@@ -165,24 +169,6 @@ export declare const protocol: Protocol<{
165
169
  readonly [x: string]: unknown;
166
170
  };
167
171
  readonly strict?: boolean | undefined;
168
- } | {
169
- readonly type: "web_search";
170
- readonly search_context_size?: string | undefined;
171
- readonly user_location?: {
172
- readonly type: "approximate";
173
- readonly region?: string | undefined;
174
- readonly city?: string | undefined;
175
- readonly country?: string | undefined;
176
- readonly timezone?: string | undefined;
177
- } | undefined;
178
- } | {
179
- readonly type: "image_generation";
180
- readonly size?: string | undefined;
181
- readonly output_format?: string | undefined;
182
- readonly reasoning_strength?: string | undefined;
183
- readonly enable_image_search?: boolean | undefined;
184
- readonly enable_web_search?: boolean | undefined;
185
- readonly enable_shell?: boolean | undefined;
186
172
  })[] | undefined;
187
173
  readonly text?: {
188
174
  readonly verbosity?: import("./utils/open-responses-options.js").TextVerbosity | undefined;
@@ -203,9 +189,10 @@ export declare const protocol: Protocol<{
203
189
  readonly top_p?: number | undefined;
204
190
  readonly frequency_penalty?: number | undefined;
205
191
  readonly presence_penalty?: number | undefined;
192
+ readonly store?: boolean | undefined;
193
+ readonly max_output_tokens?: number | undefined;
206
194
  readonly prompt_cache_key?: string | undefined;
207
195
  readonly parallel_tool_calls?: boolean | undefined;
208
- readonly store?: boolean | undefined;
209
196
  readonly include?: readonly import("./utils/open-responses-options.js").ResponseIncludable[] | undefined;
210
197
  readonly truncation?: "auto" | "disabled" | undefined;
211
198
  readonly stream_options?: {
@@ -213,7 +200,6 @@ export declare const protocol: Protocol<{
213
200
  } | undefined;
214
201
  readonly safety_identifier?: string | undefined;
215
202
  readonly top_logprobs?: number | undefined;
216
- readonly max_output_tokens?: number | undefined;
217
203
  readonly max_tool_calls?: number | undefined;
218
204
  }, string, {
219
205
  readonly [x: string]: unknown;
@@ -233,8 +219,8 @@ export declare const protocol: Protocol<{
233
219
  readonly name?: string | undefined;
234
220
  readonly namespace?: string | undefined;
235
221
  readonly arguments?: string | undefined;
236
- readonly encrypted_content?: string | null | undefined;
237
222
  readonly call_id?: string | undefined;
223
+ readonly encrypted_content?: string | null | undefined;
238
224
  }[] | undefined;
239
225
  readonly error?: unknown;
240
226
  readonly usage?: {
@@ -261,8 +247,8 @@ export declare const protocol: Protocol<{
261
247
  readonly name?: string | undefined;
262
248
  readonly namespace?: string | undefined;
263
249
  readonly arguments?: string | undefined;
264
- readonly encrypted_content?: string | null | undefined;
265
250
  readonly call_id?: string | undefined;
251
+ readonly encrypted_content?: string | null | undefined;
266
252
  } | null | undefined;
267
253
  readonly delta?: string | undefined;
268
254
  readonly arguments?: string | undefined;
@@ -271,7 +257,7 @@ export declare const protocol: Protocol<{
271
257
  readonly summary_index?: number | undefined;
272
258
  readonly status_code?: unknown;
273
259
  }, ParserState>;
274
- export declare const httpTransport: HttpTransport.HttpJsonTransport<{
260
+ export declare const httpTransport: import("../route/transport/http.js").HttpJsonTransport<{
275
261
  readonly input: readonly ({
276
262
  readonly [x: string]: unknown;
277
263
  readonly id: string;
@@ -309,6 +295,15 @@ export declare const httpTransport: HttpTransport.HttpJsonTransport<{
309
295
  readonly error?: unknown;
310
296
  readonly arguments?: string | undefined;
311
297
  readonly server_label?: string | undefined;
298
+ } | {
299
+ readonly type: "configuration_update";
300
+ readonly reasoning: {
301
+ readonly effort: import("../schema/options.js").ReasoningEffort;
302
+ };
303
+ } | {
304
+ readonly [x: string]: unknown;
305
+ readonly type: string;
306
+ readonly id: string;
312
307
  } | {
313
308
  readonly type: "reasoning";
314
309
  readonly summary: readonly {
@@ -385,13 +380,6 @@ export declare const httpTransport: HttpTransport.HttpJsonTransport<{
385
380
  readonly type: "input_video";
386
381
  readonly video_url: string;
387
382
  })[];
388
- } | {
389
- readonly id: string;
390
- readonly type: "image_generation_call";
391
- readonly status?: string | undefined;
392
- readonly error?: unknown;
393
- readonly result?: string | null | undefined;
394
- readonly output_format?: string | undefined;
395
383
  })[];
396
384
  readonly model: string;
397
385
  readonly stream: true;
@@ -404,6 +392,9 @@ export declare const httpTransport: HttpTransport.HttpJsonTransport<{
404
392
  readonly effort?: import("../schema/options.js").ReasoningEffort | undefined;
405
393
  } | undefined;
406
394
  readonly tools?: readonly ({
395
+ readonly [x: string]: unknown;
396
+ readonly type: string;
397
+ } | {
407
398
  readonly type: "function";
408
399
  readonly description: string;
409
400
  readonly name: string;
@@ -411,24 +402,6 @@ export declare const httpTransport: HttpTransport.HttpJsonTransport<{
411
402
  readonly [x: string]: unknown;
412
403
  };
413
404
  readonly strict?: boolean | undefined;
414
- } | {
415
- readonly type: "web_search";
416
- readonly search_context_size?: string | undefined;
417
- readonly user_location?: {
418
- readonly type: "approximate";
419
- readonly region?: string | undefined;
420
- readonly city?: string | undefined;
421
- readonly country?: string | undefined;
422
- readonly timezone?: string | undefined;
423
- } | undefined;
424
- } | {
425
- readonly type: "image_generation";
426
- readonly size?: string | undefined;
427
- readonly output_format?: string | undefined;
428
- readonly reasoning_strength?: string | undefined;
429
- readonly enable_image_search?: boolean | undefined;
430
- readonly enable_web_search?: boolean | undefined;
431
- readonly enable_shell?: boolean | undefined;
432
405
  })[] | undefined;
433
406
  readonly text?: {
434
407
  readonly verbosity?: import("./utils/open-responses-options.js").TextVerbosity | undefined;
@@ -449,9 +422,10 @@ export declare const httpTransport: HttpTransport.HttpJsonTransport<{
449
422
  readonly top_p?: number | undefined;
450
423
  readonly frequency_penalty?: number | undefined;
451
424
  readonly presence_penalty?: number | undefined;
425
+ readonly store?: boolean | undefined;
426
+ readonly max_output_tokens?: number | undefined;
452
427
  readonly prompt_cache_key?: string | undefined;
453
428
  readonly parallel_tool_calls?: boolean | undefined;
454
- readonly store?: boolean | undefined;
455
429
  readonly include?: readonly import("./utils/open-responses-options.js").ResponseIncludable[] | undefined;
456
430
  readonly truncation?: "auto" | "disabled" | undefined;
457
431
  readonly stream_options?: {
@@ -459,7 +433,6 @@ export declare const httpTransport: HttpTransport.HttpJsonTransport<{
459
433
  } | undefined;
460
434
  readonly safety_identifier?: string | undefined;
461
435
  readonly top_logprobs?: number | undefined;
462
- readonly max_output_tokens?: number | undefined;
463
436
  readonly max_tool_calls?: number | undefined;
464
437
  }, string>;
465
438
  export * as MetaResponses from "./meta-responses.js";
@@ -1,6 +1,5 @@
1
1
  import { Effect, Encoding, Schema } from "effect";
2
2
  import { Protocol } from "../route/protocol.js";
3
- import { HttpTransport } from "../route/transport/index.js";
4
3
  import { LLMEvent, LLMRequest, Message, ToolResultPart } from "../schema/index.js";
5
4
  import { OpenResponses } from "./open-responses.js";
6
5
  import { JsonObject, optionalArray, optionalNull, ProviderShared } from "./shared.js";
@@ -37,23 +36,18 @@ const ImageItem = Schema.Struct({
37
36
  output_format: Schema.optional(Schema.String),
38
37
  error: Schema.optional(Schema.Unknown),
39
38
  });
40
- const Body = Schema.Struct({
41
- ...OpenResponses.coreFields,
42
- input: Schema.Array(Schema.Union([OpenResponses.InputItem, ImageItem])),
43
- tools: optionalArray(Schema.Union([OpenResponses.Tool, NativeTool])),
44
- stream: Schema.Literal(true),
45
- });
46
39
  const MessageAnnotations = Schema.Struct({
47
40
  content: Schema.Array(Schema.Struct({ annotations: optionalArray(JsonObject) })),
48
41
  });
49
42
  const adapter = {
50
43
  id: ADAPTER,
51
44
  name: NAME,
45
+ nativeTool: (native) => ProviderShared.validateWith(Schema.decodeUnknownEffect(NativeTool))(native.meta),
52
46
  restoreHostedToolItem: (item) => (Schema.is(ImageItem)(item) ? item : undefined),
53
47
  };
54
48
  const fromRequest = Effect.fn("MetaResponses.fromRequest")(function* (request) {
55
49
  const key = request.model.route.providerMetadataKey ?? String(request.model.provider);
56
- const projected = ProviderShared.flattenToolRequest(LLMRequest.update(request, {
50
+ return yield* OpenResponses.fromRequestWithAdapter(LLMRequest.update(request, {
57
51
  messages: request.messages.map((message) => Message.make({
58
52
  ...message,
59
53
  content: message.content.map((part) => {
@@ -73,27 +67,14 @@ const fromRequest = Effect.fn("MetaResponses.fromRequest")(function* (request) {
73
67
  });
74
68
  }),
75
69
  })),
76
- }));
77
- return yield* ProviderShared.validateWith(Schema.decodeUnknownEffect(Body))({
78
- ...(yield* OpenResponses.lowerConversation(projected.request, adapter)),
79
- ...OpenResponses.lowerGeneration(request),
80
- tools: projected.tools.length === 0
81
- ? undefined
82
- : yield* Effect.forEach(projected.tools, (tool) => Effect.gen(function* () {
83
- if (tool.native === undefined)
84
- return yield* OpenResponses.lowerTool(NAME, tool);
85
- return yield* ProviderShared.validateWith(Schema.decodeUnknownEffect(NativeTool))(tool.native.meta);
86
- })),
87
- tool_choice: OpenResponses.allowedToolChoice(request) ??
88
- (request.toolChoice ? yield* OpenResponses.lowerToolChoice(NAME, request.toolChoice) : undefined),
89
- });
70
+ }), adapter);
90
71
  });
91
72
  const HOSTED_TOOLS = {
92
73
  web_search_call: { name: "web_search", input: (item) => item.action ?? {} },
93
74
  image_generation_call: {
94
75
  name: "image_generation",
95
76
  input: () => ({}),
96
- result: Effect.fn("MetaResponses.imageResult")(function* (raw) {
77
+ result: Effect.fnUntraced(function* (raw) {
97
78
  const item = yield* Schema.decodeUnknownEffect(ImageItem)(raw).pipe(Effect.mapError((cause) => ProviderShared.eventError(ADAPTER, "Meta returned an invalid image item", ProviderShared.encodeJson(raw), cause)));
98
79
  if (item.error !== undefined && item.error !== null)
99
80
  return { type: "error", value: item.error };
@@ -111,7 +92,7 @@ const HOSTED_TOOLS = {
111
92
  }),
112
93
  },
113
94
  };
114
- const onEvent = Effect.fn("MetaResponses.onEvent")(function* (state, input) {
95
+ const onEvent = Effect.fnUntraced(function* (state, input) {
115
96
  const event = OpenResponses.normalize(state, input);
116
97
  if (event.type === "response.output_item.done" && event.item && ResponsesHostedTools.isItem(event.item, HOSTED_TOOLS))
117
98
  return yield* ResponsesHostedTools.onDone(state, event.item, HOSTED_TOOLS);
@@ -135,7 +116,7 @@ const onEvent = Effect.fn("MetaResponses.onEvent")(function* (state, input) {
135
116
  : item),
136
117
  ];
137
118
  });
138
- const step = Effect.fn("MetaResponses.step")(function* (state, input) {
119
+ const step = Effect.fnUntraced(function* (state, input) {
139
120
  const completedItems = new Set(state.completedItems);
140
121
  const event = OpenResponses.normalize(state, input);
141
122
  if (event.type === "response.output_item.done" && event.item && completedItems.has(event.item.id))
@@ -163,7 +144,7 @@ const step = Effect.fn("MetaResponses.step")(function* (state, input) {
163
144
  });
164
145
  export const protocol = Protocol.make({
165
146
  id: ADAPTER,
166
- body: { schema: Body, from: fromRequest },
147
+ body: { schema: OpenResponses.OpenResponsesBody, from: fromRequest },
167
148
  stream: {
168
149
  event: OpenResponses.protocol.stream.event,
169
150
  initial: (request) => ({ ...OpenResponses.initial(request, adapter), completedItems: new Set() }),
@@ -171,5 +152,5 @@ export const protocol = Protocol.make({
171
152
  terminal: OpenResponses.terminal,
172
153
  },
173
154
  });
174
- export const httpTransport = HttpTransport.sseJson.with();
155
+ export const httpTransport = OpenResponses.httpTransport;
175
156
  export * as MetaResponses from "./meta-responses.js";
@@ -36,7 +36,10 @@ declare const MistralBody: Schema.Struct<{
36
36
  readonly model: Schema.String;
37
37
  readonly messages: Schema.$Array<Schema.toTaggedUnion<"role", readonly [Schema.Struct<{
38
38
  readonly role: Schema.Literal<"system">;
39
- readonly content: Schema.String;
39
+ readonly content: Schema.Union<readonly [Schema.String, Schema.$Array<Schema.Struct<{
40
+ readonly type: Schema.Literal<"text">;
41
+ readonly text: Schema.String;
42
+ }>>]>;
40
43
  }>, Schema.Struct<{
41
44
  readonly role: Schema.Literal<"user">;
42
45
  readonly content: Schema.Union<readonly [Schema.String, Schema.$Array<Schema.Union<readonly [Schema.Struct<{
@@ -123,7 +126,10 @@ export declare const fromRequest: (request: LLMRequest<import("../schema/options
123
126
  model: string & import("effect/Brand").Brand<"AI.ModelID">;
124
127
  messages: ({
125
128
  readonly role: "system";
126
- readonly content: string;
129
+ readonly content: string | readonly {
130
+ readonly type: "text";
131
+ readonly text: string;
132
+ }[];
127
133
  } | {
128
134
  readonly role: "user";
129
135
  readonly content: string | readonly ({
@@ -237,7 +243,10 @@ export declare const protocol: Protocol<{
237
243
  readonly model: string;
238
244
  readonly messages: readonly ({
239
245
  readonly role: "system";
240
- readonly content: string;
246
+ readonly content: string | readonly {
247
+ readonly type: "text";
248
+ readonly text: string;
249
+ }[];
241
250
  } | {
242
251
  readonly role: "user";
243
252
  readonly content: string | readonly ({
@@ -310,9 +319,9 @@ export declare const protocol: Protocol<{
310
319
  };
311
320
  } | undefined;
312
321
  readonly top_p?: number | undefined;
313
- readonly random_seed?: number | undefined;
314
322
  readonly frequency_penalty?: number | undefined;
315
323
  readonly presence_penalty?: number | undefined;
324
+ readonly random_seed?: number | undefined;
316
325
  readonly prompt_cache_key?: string | undefined;
317
326
  readonly safe_prompt?: boolean | undefined;
318
327
  readonly document_image_limit?: number | undefined;
@@ -329,9 +338,9 @@ export declare const protocol: Protocol<{
329
338
  } | null | undefined;
330
339
  readonly usage?: {
331
340
  readonly [x: string]: unknown;
341
+ readonly total_tokens?: number | null | undefined;
332
342
  readonly prompt_tokens?: number | null | undefined;
333
343
  readonly completion_tokens?: number | null | undefined;
334
- readonly total_tokens?: number | null | undefined;
335
344
  readonly num_cached_tokens?: number | null | undefined;
336
345
  readonly prompt_token_details?: {
337
346
  readonly [x: string]: unknown;
@@ -371,7 +380,10 @@ export declare const httpTransport: HttpTransport.HttpJsonTransport<{
371
380
  readonly model: string;
372
381
  readonly messages: readonly ({
373
382
  readonly role: "system";
374
- readonly content: string;
383
+ readonly content: string | readonly {
384
+ readonly type: "text";
385
+ readonly text: string;
386
+ }[];
375
387
  } | {
376
388
  readonly role: "user";
377
389
  readonly content: string | readonly ({
@@ -444,9 +456,9 @@ export declare const httpTransport: HttpTransport.HttpJsonTransport<{
444
456
  };
445
457
  } | undefined;
446
458
  readonly top_p?: number | undefined;
447
- readonly random_seed?: number | undefined;
448
459
  readonly frequency_penalty?: number | undefined;
449
460
  readonly presence_penalty?: number | undefined;
461
+ readonly random_seed?: number | undefined;
450
462
  readonly prompt_cache_key?: string | undefined;
451
463
  readonly safe_prompt?: boolean | undefined;
452
464
  readonly document_image_limit?: number | undefined;
@@ -459,7 +471,10 @@ export declare const route: Route<{
459
471
  readonly model: string;
460
472
  readonly messages: readonly ({
461
473
  readonly role: "system";
462
- readonly content: string;
474
+ readonly content: string | readonly {
475
+ readonly type: "text";
476
+ readonly text: string;
477
+ }[];
463
478
  } | {
464
479
  readonly role: "user";
465
480
  readonly content: string | readonly ({
@@ -532,9 +547,9 @@ export declare const route: Route<{
532
547
  };
533
548
  } | undefined;
534
549
  readonly top_p?: number | undefined;
535
- readonly random_seed?: number | undefined;
536
550
  readonly frequency_penalty?: number | undefined;
537
551
  readonly presence_penalty?: number | undefined;
552
+ readonly random_seed?: number | undefined;
538
553
  readonly prompt_cache_key?: string | undefined;
539
554
  readonly safe_prompt?: boolean | undefined;
540
555
  readonly document_image_limit?: number | undefined;
@@ -39,7 +39,10 @@ const MistralAssistantToolCall = Schema.Struct({
39
39
  function: Schema.Struct({ name: Schema.String, arguments: Schema.String }),
40
40
  });
41
41
  const MistralMessage = Schema.Union([
42
- Schema.Struct({ role: Schema.Literal("system"), content: Schema.String }),
42
+ Schema.Struct({
43
+ role: Schema.Literal("system"),
44
+ content: Schema.Union([Schema.String, Schema.Array(MistralTextContent)]),
45
+ }),
43
46
  Schema.Struct({
44
47
  role: Schema.Literal("user"),
45
48
  content: Schema.Union([Schema.String, Schema.Array(MistralUserContent)]),
@@ -140,7 +143,7 @@ const MistralEvent = Schema.StructWithRest(Schema.Struct({
140
143
  error: optionalNull(MistralError),
141
144
  }), [Schema.Record(Schema.String, Schema.Unknown)]);
142
145
  const MistralStreamEvent = Schema.Union([Schema.Literal(DONE), Protocol.jsonEvent(MistralEvent)]);
143
- const lowerMedia = Effect.fn("MistralChat.lowerMedia")(function* (part) {
146
+ const lowerMedia = Effect.fnUntraced(function* (part) {
144
147
  const mime = part.media.mediaType.toLowerCase();
145
148
  const url = ProviderShared.mediaUrl(part.media) ??
146
149
  (yield* ProviderShared.requireInlineMedia("Mistral Chat", part.media)).dataUrl;
@@ -150,7 +153,7 @@ const lowerMedia = Effect.fn("MistralChat.lowerMedia")(function* (part) {
150
153
  return { type: "document_url", document_url: url };
151
154
  return yield* ProviderShared.invalidRequest(`Mistral Chat does not support media type ${part.media.mediaType}`);
152
155
  });
153
- const lowerUser = Effect.fn("MistralChat.lowerUser")(function* (message) {
156
+ const lowerUser = Effect.fnUntraced(function* (message) {
154
157
  const content = [];
155
158
  for (const part of message.content) {
156
159
  if (part.type === "text") {
@@ -172,7 +175,7 @@ const lowerToolCall = (part, normalizeID) => ({
172
175
  type: "function",
173
176
  function: { name: part.name, arguments: ProviderShared.encodeJson(part.input) },
174
177
  });
175
- const lowerAssistant = Effect.fn("MistralChat.lowerAssistant")(function* (message, normalizeID, prefix) {
178
+ const lowerAssistant = Effect.fnUntraced(function* (message, normalizeID, prefix) {
176
179
  const structured = message.content.some((part) => part.type === "reasoning" && isMistralThinkingContent(part.providerMetadata?.mistral?.thinking));
177
180
  const content = [];
178
181
  const text = [];
@@ -208,7 +211,7 @@ const lowerAssistant = Effect.fn("MistralChat.lowerAssistant")(function* (messag
208
211
  ...(prefix ? { prefix: true } : {}),
209
212
  };
210
213
  });
211
- const lowerToolResults = Effect.fn("MistralChat.lowerToolResults")(function* (message, normalizeID) {
214
+ const lowerToolResults = Effect.fnUntraced(function* (message, normalizeID) {
212
215
  const output = [];
213
216
  for (const part of message.content) {
214
217
  if (part.type !== "tool-result")
@@ -241,9 +244,18 @@ const lowerToolResults = Effect.fn("MistralChat.lowerToolResults")(function* (me
241
244
  }
242
245
  return output;
243
246
  });
244
- const lowerMessages = Effect.fn("MistralChat.lowerMessages")(function* (request) {
247
+ const lowerMessages = Effect.fnUntraced(function* (request) {
245
248
  const normalizeID = MistralToolID.normalizer(request);
246
- const messages = request.system.length === 0 ? [] : [{ role: "system", content: ProviderShared.joinText(request.system) }];
249
+ const messages = request.system.length === 0
250
+ ? []
251
+ : [
252
+ {
253
+ role: "system",
254
+ content: request.system.length === 1
255
+ ? request.system[0].text
256
+ : request.system.map((part) => ({ type: "text", text: part.text })),
257
+ },
258
+ ];
247
259
  for (const message of request.messages) {
248
260
  if (message.role === "system") {
249
261
  const update = yield* ProviderShared.wrappedSystemUpdate("Mistral Chat", message);
@@ -439,7 +451,7 @@ const toolText = (tool) => {
439
451
  return value;
440
452
  return value === null || value === undefined ? "" : ProviderShared.encodeJson(value);
441
453
  };
442
- const appendTools = Effect.fn("MistralChat.appendTools")(function* (initial, events, deltas) {
454
+ const appendTools = Effect.fnUntraced(function* (initial, events, deltas) {
443
455
  if (deltas.length === 0)
444
456
  return initial;
445
457
  let state = closeActive(initial, events);
@@ -494,7 +506,7 @@ const hasLateContent = (event) => {
494
506
  return true;
495
507
  return (delta?.tool_calls ?? []).some((tool) => Boolean(tool.id) || Boolean(tool.function?.name) || tool.function?.arguments !== undefined);
496
508
  };
497
- const step = Effect.fn("MistralChat.step")(function* (state, event) {
509
+ const step = Effect.fnUntraced(function* (state, event) {
498
510
  if (event.error) {
499
511
  const body = ProviderShared.encodeJson(event);
500
512
  return yield* new AIError({
@@ -547,7 +559,7 @@ const step = Effect.fn("MistralChat.step")(function* (state, event) {
547
559
  events,
548
560
  ];
549
561
  });
550
- const finishEvents = Effect.fn("MistralChat.finishEvents")(function* (state) {
562
+ const finishEvents = Effect.fnUntraced(function* (state) {
551
563
  if (!state.finishReason)
552
564
  return yield* new AIError({
553
565
  reason: new InvalidProviderOutputError({