@effect-uai/mistral 0.11.0 → 0.12.1

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 (55) hide show
  1. package/dist/Mistral.d.mts +6 -5
  2. package/dist/Mistral.d.mts.map +1 -1
  3. package/dist/Mistral.mjs +1 -1
  4. package/dist/Mistral.mjs.map +1 -1
  5. package/dist/MistralRealtimeTranscriber.d.mts +1 -3
  6. package/dist/MistralRealtimeTranscriber.d.mts.map +1 -1
  7. package/dist/MistralRealtimeTranscriber.mjs +1 -1
  8. package/dist/MistralRealtimeTranscriber.mjs.map +1 -1
  9. package/dist/MistralSynthesizer.d.mts +1 -3
  10. package/dist/MistralSynthesizer.d.mts.map +1 -1
  11. package/dist/MistralSynthesizer.mjs +4 -2
  12. package/dist/MistralSynthesizer.mjs.map +1 -1
  13. package/dist/MistralTranscriber.d.mts +1 -3
  14. package/dist/MistralTranscriber.d.mts.map +1 -1
  15. package/dist/MistralTranscriber.mjs +3 -2
  16. package/dist/MistralTranscriber.mjs.map +1 -1
  17. package/dist/audioCodec.d.mts +0 -1
  18. package/dist/audioCodec.d.mts.map +1 -1
  19. package/dist/audioCodec.mjs.map +1 -1
  20. package/dist/codec.d.mts +5 -82
  21. package/dist/codec.d.mts.map +1 -1
  22. package/dist/codec.mjs +11 -161
  23. package/dist/codec.mjs.map +1 -1
  24. package/dist/codec.test.d.mts +1 -1
  25. package/dist/codec.test.mjs +1 -1
  26. package/dist/codec.test.mjs.map +1 -1
  27. package/dist/http.d.mts +0 -1
  28. package/dist/http.d.mts.map +1 -1
  29. package/dist/http.mjs.map +1 -1
  30. package/dist/index.d.mts +1 -1
  31. package/dist/{magic-string.es-CaWgF-3p.mjs → magic-string.es-CUAnjKYC.mjs} +14 -13
  32. package/dist/{magic-string.es-CaWgF-3p.mjs.map → magic-string.es-CUAnjKYC.mjs.map} +1 -1
  33. package/dist/{models-B1wZuvz5.d.mts → models-gP7kSqeb.d.mts} +1 -1
  34. package/dist/models-gP7kSqeb.d.mts.map +1 -0
  35. package/dist/models.d.mts +1 -1
  36. package/dist/onHalt.test.d.mts +1 -1
  37. package/dist/onHalt.test.mjs +1 -1
  38. package/dist/onHalt.test.mjs.map +1 -1
  39. package/dist/{realtimeStt-BFcctqFC.d.mts → realtimeStt-BcthMc57.d.mts} +3 -3
  40. package/dist/realtimeStt-BcthMc57.d.mts.map +1 -0
  41. package/dist/realtimeStt.d.mts +1 -1
  42. package/dist/realtimeStt.mjs.map +1 -1
  43. package/dist/{test.DNmyFkvJ-CPKukVWS.mjs → test.DNmyFkvJ-N3QqMRwZ.mjs} +247 -222
  44. package/dist/test.DNmyFkvJ-N3QqMRwZ.mjs.map +1 -0
  45. package/package.json +8 -5
  46. package/src/Mistral.ts +4 -7
  47. package/src/MistralRealtimeTranscriber.ts +4 -8
  48. package/src/MistralSynthesizer.ts +8 -12
  49. package/src/MistralTranscriber.ts +9 -11
  50. package/src/audioCodec.ts +25 -20
  51. package/src/codec.ts +40 -232
  52. package/dist/models-B1wZuvz5.d.mts.map +0 -1
  53. package/dist/realtimeStt-BFcctqFC.d.mts.map +0 -1
  54. package/dist/test.DNmyFkvJ-CPKukVWS.mjs.map +0 -1
  55. /package/dist/{chunk-CfYAbeIz.mjs → rolldown-runtime-D7D4PA-g.mjs} +0 -0
package/dist/codec.mjs CHANGED
@@ -1,9 +1,8 @@
1
- import { t as __exportAll } from "./chunk-CfYAbeIz.mjs";
2
- import { Array, Encoding, Match, Option, Schema } from "effect";
3
- import { TurnEvent } from "@effect-uai/core/Turn";
1
+ import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
2
+ import { Array, Effect, Encoding, Match } from "effect";
3
+ import { accumulatorToTurn, applyChunk, decodeChunk as decodeChunk$1, emptyAccumulator, responseFormatWire, toolsWire } from "@effect-uai/chat-completions/codec";
4
4
  //#region src/codec.ts
5
5
  var codec_exports = /* @__PURE__ */ __exportAll({
6
- WireChunk: () => WireChunk,
7
6
  accumulatorToTurn: () => accumulatorToTurn,
8
7
  applyChunk: () => applyChunk,
9
8
  decodeChunk: () => decodeChunk,
@@ -77,168 +76,19 @@ const foldItem = (acc, item) => Match.value(item).pipe(Match.discriminatorsExhau
77
76
  }));
78
77
  /** Convert our `HistoryItem[]` history into Mistral chat `messages`. */
79
78
  const itemsToMessages = (items) => Array.reduce(items, [], foldItem);
80
- const toolsWire = (descriptors) => descriptors.length > 0 ? Option.some(descriptors.map((t) => ({
81
- type: "function",
82
- function: {
83
- name: t.name,
84
- description: t.description,
85
- parameters: t.inputSchema,
86
- ...t.strict !== void 0 && { strict: t.strict }
87
- }
88
- }))) : Option.none();
89
79
  const toolChoiceWire = (choice) => Match.value(choice).pipe(Match.when("auto", () => "auto"), Match.when("required", () => "any"), Match.when("none", () => "none"), Match.orElse((c) => ({
90
80
  type: "function",
91
81
  function: { name: c.name }
92
82
  })));
93
- const responseFormatWire = (structured) => ({
94
- type: "json_schema",
95
- json_schema: {
96
- name: structured.name,
97
- schema: structured.schema["~standard"].jsonSchema.input({ target: "draft-2020-12" }),
98
- ...structured.strict !== void 0 && { strict: structured.strict }
99
- }
100
- });
101
- const WireFunction = Schema.Struct({
102
- name: Schema.optional(Schema.NullOr(Schema.String)),
103
- arguments: Schema.optional(Schema.NullOr(Schema.String))
104
- });
105
- const WireToolCall = Schema.Struct({
106
- index: Schema.optional(Schema.Number),
107
- id: Schema.optional(Schema.NullOr(Schema.String)),
108
- function: Schema.optional(WireFunction)
109
- });
110
- const WireDelta = Schema.Struct({
111
- role: Schema.optional(Schema.NullOr(Schema.String)),
112
- content: Schema.optional(Schema.NullOr(Schema.String)),
113
- tool_calls: Schema.optional(Schema.NullOr(Schema.Array(WireToolCall)))
114
- });
115
- const WireChoice = Schema.Struct({
116
- index: Schema.optional(Schema.Number),
117
- delta: Schema.optional(WireDelta),
118
- finish_reason: Schema.optional(Schema.NullOr(Schema.String))
119
- });
120
- const WireUsage = Schema.Struct({
121
- prompt_tokens: Schema.optional(Schema.Number),
122
- completion_tokens: Schema.optional(Schema.Number),
123
- total_tokens: Schema.optional(Schema.Number)
124
- });
125
- const WireChunk = Schema.Struct({
126
- choices: Schema.optional(Schema.Array(WireChoice)),
127
- usage: Schema.optional(Schema.NullOr(WireUsage))
128
- });
129
- const decodeChunk = Schema.decodeUnknownEffect(WireChunk);
130
- const emptyAccumulator = {
131
- text: "",
132
- tools: /* @__PURE__ */ new Map(),
133
- order: [],
134
- usage: {},
135
- finishReason: Option.none()
136
- };
137
- const usageFrom = (wire) => ({
138
- ...wire.prompt_tokens !== void 0 && { input_tokens: wire.prompt_tokens },
139
- ...wire.completion_tokens !== void 0 && { output_tokens: wire.completion_tokens },
140
- ...wire.total_tokens !== void 0 && { total_tokens: wire.total_tokens }
141
- });
142
- const reasonToStop = Match.type().pipe(Match.when("stop", () => "stop"), Match.when("length", () => "max_tokens"), Match.when("model_length", () => "max_tokens"), Match.when("tool_calls", () => "tool_calls"), Match.when("content_filter", () => "content_filter"), Match.orElse(() => "stop"));
143
- const stopReasonOf = (acc) => Option.match(acc.finishReason, {
144
- onNone: () => acc.tools.size > 0 ? "tool_calls" : "stop",
145
- onSome: reasonToStop
146
- });
147
- const withTool = (acc, index, tool, isNew) => ({
148
- ...acc,
149
- tools: new Map(acc.tools).set(index, tool),
150
- order: isNew ? [...acc.order, index] : acc.order
151
- });
152
- const applyContent = (acc, delta) => {
153
- const content = delta?.content;
154
- return content !== void 0 && content !== null && content.length > 0 ? [{
155
- ...acc,
156
- text: acc.text + content
157
- }, [TurnEvent.TextDelta({ text: content })]] : [acc, []];
158
- };
159
- const applyToolCall = (acc, tc, position) => {
160
- const index = tc.index ?? position;
161
- const argsDelta = tc.function?.arguments ?? "";
162
- const existing = acc.tools.get(index);
163
- if (existing === void 0) {
164
- const call_id = tc.id ?? `call_${index}`;
165
- const name = tc.function?.name ?? "";
166
- return [withTool(acc, index, {
167
- call_id,
168
- name,
169
- arguments: argsDelta
170
- }, true), [TurnEvent.ToolCallStart({
171
- call_id,
172
- name
173
- }), ...argsDelta.length > 0 ? [TurnEvent.ToolCallArgsDelta({
174
- call_id,
175
- delta: argsDelta
176
- })] : []]];
177
- }
178
- return argsDelta.length > 0 ? [withTool(acc, index, {
179
- ...existing,
180
- arguments: existing.arguments + argsDelta
181
- }, false), [TurnEvent.ToolCallArgsDelta({
182
- call_id: existing.call_id,
183
- delta: argsDelta
184
- })]] : [acc, []];
185
- };
186
- const chain = (step, next) => {
187
- const [acc, events] = step;
188
- const [acc2, more] = next(acc);
189
- return [acc2, [...events, ...more]];
190
- };
191
- const applyChoice = (step, choice) => {
192
- const withContent = chain(step, (acc) => applyContent(acc, choice.delta));
193
- const withTools = Array.reduce(choice.delta?.tool_calls ?? [], withContent, (s, tc, i) => chain(s, (acc) => applyToolCall(acc, tc, i)));
194
- const reason = choice.finish_reason;
195
- return reason !== void 0 && reason !== null ? [{
196
- ...withTools[0],
197
- finishReason: Option.some(reason)
198
- }, withTools[1]] : withTools;
199
- };
200
- /**
201
- * Fold one decoded chunk into the accumulator, returning the next state and
202
- * the `TurnEvent`s the chunk produced. Mirrors Anthropic's `deltasFromEvent`,
203
- * but over chat-completions deltas.
204
- */
205
- const applyChunk = (acc, chunk) => {
206
- const afterChoices = Array.reduce(chunk.choices ?? [], [acc, []], applyChoice);
207
- const usage = chunk.usage;
208
- return usage !== void 0 && usage !== null ? chain(afterChoices, (a) => {
209
- const u = usageFrom(usage);
210
- return [{
211
- ...a,
212
- usage: u
213
- }, [TurnEvent.UsageUpdate({ usage: u })]];
214
- }) : afterChoices;
215
- };
216
- /** Assemble the terminal `Turn` from the accumulated state. */
217
- const accumulatorToTurn = (acc) => {
218
- const message = acc.text.length > 0 ? [{
219
- type: "message",
220
- role: "assistant",
221
- content: [{
222
- type: "output_text",
223
- text: acc.text
224
- }]
225
- }] : [];
226
- const toolCalls = acc.order.flatMap((index) => {
227
- const t = acc.tools.get(index);
228
- return t === void 0 ? [] : [{
229
- type: "function_call",
230
- call_id: t.call_id,
231
- name: t.name,
232
- arguments: t.arguments
233
- }];
234
- });
235
- return {
236
- items: [...message, ...toolCalls],
237
- usage: acc.usage,
238
- stop_reason: stopReasonOf(acc)
239
- };
83
+ const normalizeChunk = (chunk) => chunk.choices === void 0 ? chunk : {
84
+ ...chunk,
85
+ choices: chunk.choices.map((c) => c.finish_reason === "model_length" ? {
86
+ ...c,
87
+ finish_reason: "length"
88
+ } : c)
240
89
  };
90
+ const decodeChunk = (u) => decodeChunk$1(u).pipe(Effect.map(normalizeChunk));
241
91
  //#endregion
242
- export { WireChunk, accumulatorToTurn, applyChunk, decodeChunk, emptyAccumulator, itemsToMessages, responseFormatWire, codec_exports as t, toolChoiceWire, toolsWire };
92
+ export { accumulatorToTurn, applyChunk, decodeChunk, emptyAccumulator, itemsToMessages, responseFormatWire, codec_exports as t, toolChoiceWire, toolsWire };
243
93
 
244
94
  //# sourceMappingURL=codec.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"codec.mjs","names":["Arr"],"sources":["../src/codec.ts"],"sourcesContent":["import { Array as Arr, Encoding, Match, Option, Schema } from \"effect\"\nimport type {\n ContentBlock,\n HistoryItem,\n InputImage,\n StopReason,\n Usage,\n} from \"@effect-uai/core/Items\"\nimport type { StructuredFormat } from \"@effect-uai/core/StructuredFormat\"\nimport type { ToolDescriptor } from \"@effect-uai/core/Tool\"\nimport type { Turn } from \"@effect-uai/core/Turn\"\nimport { TurnEvent } from \"@effect-uai/core/Turn\"\n\n// ---------------------------------------------------------------------------\n// History → Mistral chat `messages`\n//\n// Mistral speaks the OpenAI chat-completions dialect: a flat list of\n// `{ role, content, ... }` objects where an assistant turn's tool calls live\n// on the assistant message (`tool_calls`) and each tool result is its own\n// `{ role: \"tool\", tool_call_id, content }` message. Our history is a flatter\n// item list (assistant message, then separate `function_call` items), so we\n// fold consecutive `function_call`s onto the preceding assistant message.\n// ---------------------------------------------------------------------------\n\ntype WireMessage = {\n role: string\n content: string | ReadonlyArray<Record<string, unknown>>\n tool_calls?: ReadonlyArray<Record<string, unknown>>\n tool_call_id?: string\n}\n\n/** A `data:` URI for inline image bytes; URLs pass through untouched. */\nconst imageSourceToUrl = Match.type<InputImage[\"source\"]>().pipe(\n Match.tag(\"url\", (s) => s.url),\n Match.tag(\"base64\", (s) => `data:${s.mimeType};base64,${s.base64}`),\n Match.tag(\"bytes\", (s) => `data:${s.mimeType};base64,${Encoding.encodeBase64(s.bytes)}`),\n Match.exhaustive,\n)\n\nconst blockToPart = Match.type<ContentBlock>().pipe(\n Match.discriminatorsExhaustive(\"type\")({\n input_text: (b) => ({ type: \"text\", text: b.text }),\n output_text: (b) => ({ type: \"text\", text: b.text }),\n refusal: (b) => ({ type: \"text\", text: b.text }),\n input_image: (b) => ({ type: \"image_url\", image_url: imageSourceToUrl(b.source) }),\n }),\n)\n\nconst isTextBlock = (b: ContentBlock): boolean =>\n b.type === \"input_text\" || b.type === \"output_text\" || b.type === \"refusal\"\n\nconst textOfBlock = (b: ContentBlock): string => (b.type === \"input_image\" ? \"\" : b.text)\n\n/**\n * Collapse a message's content to a plain string when it is text-only\n * (the common case Mistral prefers), otherwise emit the multimodal parts\n * array.\n */\nconst encodeContent = (\n content: ReadonlyArray<ContentBlock>,\n): string | ReadonlyArray<Record<string, unknown>> =>\n Arr.every(content, isTextBlock) ? content.map(textOfBlock).join(\"\") : content.map(blockToPart)\n\nconst toolCallWire = (call_id: string, name: string, args: string): Record<string, unknown> => ({\n id: call_id,\n type: \"function\",\n function: { name, arguments: args },\n})\n\nconst appendToolCall = (\n acc: ReadonlyArray<WireMessage>,\n call_id: string,\n name: string,\n args: string,\n): ReadonlyArray<WireMessage> => {\n const last = acc[acc.length - 1]\n const wire = toolCallWire(call_id, name, args)\n // Attach to the immediately-preceding assistant message (not a tool result),\n // matching the OpenAI/Mistral shape where tool calls ride the assistant turn.\n if (last !== undefined && last.role === \"assistant\" && last.tool_call_id === undefined) {\n return [...acc.slice(0, -1), { ...last, tool_calls: [...(last.tool_calls ?? []), wire] }]\n }\n return [...acc, { role: \"assistant\", content: \"\", tool_calls: [wire] }]\n}\n\nconst foldItem = (acc: ReadonlyArray<WireMessage>, item: HistoryItem): ReadonlyArray<WireMessage> =>\n Match.value(item).pipe(\n Match.discriminatorsExhaustive(\"type\")({\n message: (m) => [...acc, { role: m.role, content: encodeContent(m.content) }],\n function_call: (f) => appendToolCall(acc, f.call_id, f.name, f.arguments),\n function_call_output: (o) => [\n ...acc,\n { role: \"tool\", tool_call_id: o.call_id, content: o.output },\n ],\n // Reasoning items are not replayed to the chat-completions endpoint.\n reasoning: () => acc,\n }),\n )\n\n/** Convert our `HistoryItem[]` history into Mistral chat `messages`. */\nexport const itemsToMessages = (items: ReadonlyArray<HistoryItem>): ReadonlyArray<WireMessage> =>\n Arr.reduce(items, [] as ReadonlyArray<WireMessage>, foldItem)\n\n// ---------------------------------------------------------------------------\n// tools / tool_choice / response_format\n// ---------------------------------------------------------------------------\n\nexport const toolsWire = (\n descriptors: ReadonlyArray<ToolDescriptor>,\n): Option.Option<ReadonlyArray<Record<string, unknown>>> =>\n descriptors.length > 0\n ? Option.some(\n descriptors.map((t) => ({\n type: \"function\",\n function: {\n name: t.name,\n description: t.description,\n parameters: t.inputSchema,\n ...(t.strict !== undefined && { strict: t.strict }),\n },\n })),\n )\n : Option.none()\n\ntype ToolChoice =\n | \"auto\"\n | \"required\"\n | \"none\"\n | { readonly type: \"function\"; readonly name: string }\n\n// Mistral uses \"any\" for forced tool use (OpenAI's \"required\").\nexport const toolChoiceWire = (choice: ToolChoice): string | Record<string, unknown> =>\n Match.value(choice).pipe(\n Match.when(\"auto\", () => \"auto\" as const),\n Match.when(\"required\", () => \"any\" as const),\n Match.when(\"none\", () => \"none\" as const),\n Match.orElse((c) => ({ type: \"function\", function: { name: c.name } })),\n )\n\nexport const responseFormatWire = (\n structured: StructuredFormat<unknown>,\n): Record<string, unknown> => ({\n type: \"json_schema\",\n json_schema: {\n name: structured.name,\n schema: structured.schema[\"~standard\"].jsonSchema.input({ target: \"draft-2020-12\" }),\n ...(structured.strict !== undefined && { strict: structured.strict }),\n },\n})\n\n// ---------------------------------------------------------------------------\n// Streaming decode: chat.completion.chunk → TurnEvent\n// ---------------------------------------------------------------------------\n\nconst WireFunction = Schema.Struct({\n name: Schema.optional(Schema.NullOr(Schema.String)),\n arguments: Schema.optional(Schema.NullOr(Schema.String)),\n})\n\nconst WireToolCall = Schema.Struct({\n index: Schema.optional(Schema.Number),\n id: Schema.optional(Schema.NullOr(Schema.String)),\n function: Schema.optional(WireFunction),\n})\n\nconst WireDelta = Schema.Struct({\n role: Schema.optional(Schema.NullOr(Schema.String)),\n content: Schema.optional(Schema.NullOr(Schema.String)),\n tool_calls: Schema.optional(Schema.NullOr(Schema.Array(WireToolCall))),\n})\n\nconst WireChoice = Schema.Struct({\n index: Schema.optional(Schema.Number),\n delta: Schema.optional(WireDelta),\n finish_reason: Schema.optional(Schema.NullOr(Schema.String)),\n})\n\nconst WireUsage = Schema.Struct({\n prompt_tokens: Schema.optional(Schema.Number),\n completion_tokens: Schema.optional(Schema.Number),\n total_tokens: Schema.optional(Schema.Number),\n})\n\nexport const WireChunk = Schema.Struct({\n choices: Schema.optional(Schema.Array(WireChoice)),\n usage: Schema.optional(Schema.NullOr(WireUsage)),\n})\nexport type WireChunk = typeof WireChunk.Type\n\nexport const decodeChunk = Schema.decodeUnknownEffect(WireChunk)\n\n// ---------------------------------------------------------------------------\n// Accumulator\n// ---------------------------------------------------------------------------\n\ntype ToolAcc = {\n readonly call_id: string\n readonly name: string\n readonly arguments: string\n}\n\nexport type Accumulator = {\n readonly text: string\n /** Tool calls keyed by their wire `index` (defaults to position when absent). */\n readonly tools: ReadonlyMap<number, ToolAcc>\n readonly order: ReadonlyArray<number>\n readonly usage: Usage\n readonly finishReason: Option.Option<string>\n}\n\nexport const emptyAccumulator: Accumulator = {\n text: \"\",\n tools: new Map(),\n order: [],\n usage: {},\n finishReason: Option.none(),\n}\n\n/** State threaded through the fold plus the events the step produced. */\ntype Step = readonly [Accumulator, ReadonlyArray<TurnEvent>]\n\nconst usageFrom = (wire: typeof WireUsage.Type): Usage => ({\n ...(wire.prompt_tokens !== undefined && { input_tokens: wire.prompt_tokens }),\n ...(wire.completion_tokens !== undefined && { output_tokens: wire.completion_tokens }),\n ...(wire.total_tokens !== undefined && { total_tokens: wire.total_tokens }),\n})\n\nconst reasonToStop = Match.type<string>().pipe(\n Match.when(\"stop\", () => \"stop\" as const),\n Match.when(\"length\", () => \"max_tokens\" as const),\n Match.when(\"model_length\", () => \"max_tokens\" as const),\n Match.when(\"tool_calls\", () => \"tool_calls\" as const),\n Match.when(\"content_filter\", () => \"content_filter\" as const),\n Match.orElse(() => \"stop\" as const),\n)\n\nconst stopReasonOf = (acc: Accumulator): StopReason =>\n Option.match(acc.finishReason, {\n onNone: () => (acc.tools.size > 0 ? \"tool_calls\" : \"stop\"),\n onSome: reasonToStop,\n })\n\nconst withTool = (acc: Accumulator, index: number, tool: ToolAcc, isNew: boolean): Accumulator => ({\n ...acc,\n tools: new Map(acc.tools).set(index, tool),\n order: isNew ? [...acc.order, index] : acc.order,\n})\n\nconst applyContent = (acc: Accumulator, delta: typeof WireDelta.Type | undefined): Step => {\n const content = delta?.content\n return content !== undefined && content !== null && content.length > 0\n ? [{ ...acc, text: acc.text + content }, [TurnEvent.TextDelta({ text: content })]]\n : [acc, []]\n}\n\nconst applyToolCall = (acc: Accumulator, tc: typeof WireToolCall.Type, position: number): Step => {\n const index = tc.index ?? position\n const argsDelta = tc.function?.arguments ?? \"\"\n const existing = acc.tools.get(index)\n if (existing === undefined) {\n const call_id = tc.id ?? `call_${index}`\n const name = tc.function?.name ?? \"\"\n return [\n withTool(acc, index, { call_id, name, arguments: argsDelta }, true),\n [\n TurnEvent.ToolCallStart({ call_id, name }),\n ...(argsDelta.length > 0\n ? [TurnEvent.ToolCallArgsDelta({ call_id, delta: argsDelta })]\n : []),\n ],\n ]\n }\n return argsDelta.length > 0\n ? [\n withTool(acc, index, { ...existing, arguments: existing.arguments + argsDelta }, false),\n [TurnEvent.ToolCallArgsDelta({ call_id: existing.call_id, delta: argsDelta })],\n ]\n : [acc, []]\n}\n\nconst chain = (step: Step, next: (acc: Accumulator) => Step): Step => {\n const [acc, events] = step\n const [acc2, more] = next(acc)\n return [acc2, [...events, ...more]]\n}\n\nconst applyChoice = (step: Step, choice: typeof WireChoice.Type): Step => {\n const withContent = chain(step, (acc) => applyContent(acc, choice.delta))\n const withTools = Arr.reduce(choice.delta?.tool_calls ?? [], withContent, (s: Step, tc, i) =>\n chain(s, (acc) => applyToolCall(acc, tc, i)),\n )\n const reason = choice.finish_reason\n return reason !== undefined && reason !== null\n ? [{ ...withTools[0], finishReason: Option.some(reason) }, withTools[1]]\n : withTools\n}\n\n/**\n * Fold one decoded chunk into the accumulator, returning the next state and\n * the `TurnEvent`s the chunk produced. Mirrors Anthropic's `deltasFromEvent`,\n * but over chat-completions deltas.\n */\nexport const applyChunk = (acc: Accumulator, chunk: WireChunk): Step => {\n const afterChoices = Arr.reduce(chunk.choices ?? [], [acc, []] as Step, applyChoice)\n const usage = chunk.usage\n return usage !== undefined && usage !== null\n ? chain(afterChoices, (a) => {\n const u = usageFrom(usage)\n return [{ ...a, usage: u }, [TurnEvent.UsageUpdate({ usage: u })]]\n })\n : afterChoices\n}\n\n/** Assemble the terminal `Turn` from the accumulated state. */\nexport const accumulatorToTurn = (acc: Accumulator): Turn => {\n const message: ReadonlyArray<HistoryItem> =\n acc.text.length > 0\n ? [{ type: \"message\", role: \"assistant\", content: [{ type: \"output_text\", text: acc.text }] }]\n : []\n const toolCalls: ReadonlyArray<HistoryItem> = acc.order.flatMap((index) => {\n const t = acc.tools.get(index)\n return t === undefined\n ? []\n : [\n {\n type: \"function_call\" as const,\n call_id: t.call_id,\n name: t.name,\n arguments: t.arguments,\n },\n ]\n })\n return {\n items: [...message, ...toolCalls],\n usage: acc.usage,\n stop_reason: stopReasonOf(acc),\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"codec.mjs","names":["Arr","decodeChunkShared"],"sources":["../src/codec.ts"],"sourcesContent":["import { Array as Arr, Effect, Encoding, Match, Option } from \"effect\"\nimport type { ContentBlock, HistoryItem, InputImage } from \"@effect-uai/core/Items\"\n\n// The streaming decoder, tool encoding, and terminal-turn assembly are the\n// generic OpenAI chat-completions codec: Mistral speaks that dialect on the\n// wire, so it reuses them verbatim. Only request encoding diverges (below).\nexport {\n type Accumulator,\n type WireChunk,\n accumulatorToTurn,\n applyChunk,\n emptyAccumulator,\n responseFormatWire,\n toolsWire,\n} from \"@effect-uai/chat-completions/codec\"\nimport {\n type WireChunk,\n decodeChunk as decodeChunkShared,\n} from \"@effect-uai/chat-completions/codec\"\n\n// ---------------------------------------------------------------------------\n// History → Mistral chat `messages`\n//\n// Same shape as the generic codec, with one wire quirk: Mistral takes a bare\n// `image_url` string, not OpenAI's `image_url: { url }` object. That is the\n// reason this half stays local rather than importing `itemsToMessages`.\n// ---------------------------------------------------------------------------\n\ntype WireMessage = {\n role: string\n content: string | ReadonlyArray<Record<string, unknown>>\n tool_calls?: ReadonlyArray<Record<string, unknown>>\n tool_call_id?: string\n}\n\n/** A `data:` URI for inline image bytes; URLs pass through untouched. */\nconst imageSourceToUrl = Match.type<InputImage[\"source\"]>().pipe(\n Match.tag(\"url\", (s) => s.url),\n Match.tag(\"base64\", (s) => `data:${s.mimeType};base64,${s.base64}`),\n Match.tag(\"bytes\", (s) => `data:${s.mimeType};base64,${Encoding.encodeBase64(s.bytes)}`),\n Match.exhaustive,\n)\n\nconst blockToPart = Match.type<ContentBlock>().pipe(\n Match.discriminatorsExhaustive(\"type\")({\n input_text: (b) => ({ type: \"text\", text: b.text }),\n output_text: (b) => ({ type: \"text\", text: b.text }),\n refusal: (b) => ({ type: \"text\", text: b.text }),\n // Bare string, not `{ url }`: the Mistral divergence from OpenAI.\n input_image: (b) => ({ type: \"image_url\", image_url: imageSourceToUrl(b.source) }),\n }),\n)\n\nconst isTextBlock = (b: ContentBlock): boolean =>\n b.type === \"input_text\" || b.type === \"output_text\" || b.type === \"refusal\"\n\nconst textOfBlock = (b: ContentBlock): string => (b.type === \"input_image\" ? \"\" : b.text)\n\n/**\n * Collapse a message's content to a plain string when it is text-only\n * (the common case Mistral prefers), otherwise emit the multimodal parts\n * array.\n */\nconst encodeContent = (\n content: ReadonlyArray<ContentBlock>,\n): string | ReadonlyArray<Record<string, unknown>> =>\n Arr.every(content, isTextBlock) ? content.map(textOfBlock).join(\"\") : content.map(blockToPart)\n\nconst toolCallWire = (call_id: string, name: string, args: string): Record<string, unknown> => ({\n id: call_id,\n type: \"function\",\n function: { name, arguments: args },\n})\n\nconst appendToolCall = (\n acc: ReadonlyArray<WireMessage>,\n call_id: string,\n name: string,\n args: string,\n): ReadonlyArray<WireMessage> => {\n const last = acc[acc.length - 1]\n const wire = toolCallWire(call_id, name, args)\n // Attach to the immediately-preceding assistant message (not a tool result),\n // matching the OpenAI/Mistral shape where tool calls ride the assistant turn.\n if (last !== undefined && last.role === \"assistant\" && last.tool_call_id === undefined) {\n return [...acc.slice(0, -1), { ...last, tool_calls: [...(last.tool_calls ?? []), wire] }]\n }\n return [...acc, { role: \"assistant\", content: \"\", tool_calls: [wire] }]\n}\n\nconst foldItem = (acc: ReadonlyArray<WireMessage>, item: HistoryItem): ReadonlyArray<WireMessage> =>\n Match.value(item).pipe(\n Match.discriminatorsExhaustive(\"type\")({\n message: (m) => [...acc, { role: m.role, content: encodeContent(m.content) }],\n function_call: (f) => appendToolCall(acc, f.call_id, f.name, f.arguments),\n function_call_output: (o) => [\n ...acc,\n { role: \"tool\", tool_call_id: o.call_id, content: o.output },\n ],\n // Reasoning items are not replayed to the chat-completions endpoint.\n reasoning: () => acc,\n }),\n )\n\n/** Convert our `HistoryItem[]` history into Mistral chat `messages`. */\nexport const itemsToMessages = (items: ReadonlyArray<HistoryItem>): ReadonlyArray<WireMessage> =>\n Arr.reduce(items, [] as ReadonlyArray<WireMessage>, foldItem)\n\n// ---------------------------------------------------------------------------\n// tool_choice\n// ---------------------------------------------------------------------------\n\ntype ToolChoice =\n | \"auto\"\n | \"required\"\n | \"none\"\n | { readonly type: \"function\"; readonly name: string }\n\n// Mistral uses \"any\" for forced tool use (OpenAI's \"required\").\nexport const toolChoiceWire = (choice: ToolChoice): string | Record<string, unknown> =>\n Match.value(choice).pipe(\n Match.when(\"auto\", () => \"auto\" as const),\n Match.when(\"required\", () => \"any\" as const),\n Match.when(\"none\", () => \"none\" as const),\n Match.orElse((c) => ({ type: \"function\", function: { name: c.name } })),\n )\n\n// ---------------------------------------------------------------------------\n// Streaming decode\n// ---------------------------------------------------------------------------\n\n// Mistral emits `model_length` when it truncates on the context window; the\n// shared decoder only knows OpenAI's `length`. Rewrite it before folding so the\n// shared accumulator maps it to `max_tokens` rather than the `stop` fallback.\nconst normalizeChunk = (chunk: WireChunk): WireChunk =>\n chunk.choices === undefined\n ? chunk\n : {\n ...chunk,\n choices: chunk.choices.map((c) =>\n c.finish_reason === \"model_length\" ? { ...c, finish_reason: \"length\" } : c,\n ),\n }\n\nexport const decodeChunk = (u: unknown): Effect.Effect<WireChunk, unknown> =>\n decodeChunkShared(u).pipe(Effect.map(normalizeChunk))\n"],"mappings":";;;;;;;;;;;;;;;AAoCA,MAAM,mBAAmB,MAAM,KAA2B,CAAC,CAAC,KAC1D,MAAM,IAAI,QAAQ,MAAM,EAAE,GAAG,GAC7B,MAAM,IAAI,WAAW,MAAM,QAAQ,EAAE,SAAS,UAAU,EAAE,QAAQ,GAClE,MAAM,IAAI,UAAU,MAAM,QAAQ,EAAE,SAAS,UAAU,SAAS,aAAa,EAAE,KAAK,GAAG,GACvF,MAAM,UACR;AAEA,MAAM,cAAc,MAAM,KAAmB,CAAC,CAAC,KAC7C,MAAM,yBAAyB,MAAM,CAAC,CAAC;CACrC,aAAa,OAAO;EAAE,MAAM;EAAQ,MAAM,EAAE;CAAK;CACjD,cAAc,OAAO;EAAE,MAAM;EAAQ,MAAM,EAAE;CAAK;CAClD,UAAU,OAAO;EAAE,MAAM;EAAQ,MAAM,EAAE;CAAK;CAE9C,cAAc,OAAO;EAAE,MAAM;EAAa,WAAW,iBAAiB,EAAE,MAAM;CAAE;AAClF,CAAC,CACH;AAEA,MAAM,eAAe,MACnB,EAAE,SAAS,gBAAgB,EAAE,SAAS,iBAAiB,EAAE,SAAS;AAEpE,MAAM,eAAe,MAA6B,EAAE,SAAS,gBAAgB,KAAK,EAAE;;;;;;AAOpF,MAAM,iBACJ,YAEAA,MAAI,MAAM,SAAS,WAAW,IAAI,QAAQ,IAAI,WAAW,CAAC,CAAC,KAAK,EAAE,IAAI,QAAQ,IAAI,WAAW;AAE/F,MAAM,gBAAgB,SAAiB,MAAc,UAA2C;CAC9F,IAAI;CACJ,MAAM;CACN,UAAU;EAAE;EAAM,WAAW;CAAK;AACpC;AAEA,MAAM,kBACJ,KACA,SACA,MACA,SAC+B;CAC/B,MAAM,OAAO,IAAI,IAAI,SAAS;CAC9B,MAAM,OAAO,aAAa,SAAS,MAAM,IAAI;CAG7C,IAAI,SAAS,KAAA,KAAa,KAAK,SAAS,eAAe,KAAK,iBAAiB,KAAA,GAC3E,OAAO,CAAC,GAAG,IAAI,MAAM,GAAG,EAAE,GAAG;EAAE,GAAG;EAAM,YAAY,CAAC,GAAI,KAAK,cAAc,CAAC,GAAI,IAAI;CAAE,CAAC;CAE1F,OAAO,CAAC,GAAG,KAAK;EAAE,MAAM;EAAa,SAAS;EAAI,YAAY,CAAC,IAAI;CAAE,CAAC;AACxE;AAEA,MAAM,YAAY,KAAiC,SACjD,MAAM,MAAM,IAAI,CAAC,CAAC,KAChB,MAAM,yBAAyB,MAAM,CAAC,CAAC;CACrC,UAAU,MAAM,CAAC,GAAG,KAAK;EAAE,MAAM,EAAE;EAAM,SAAS,cAAc,EAAE,OAAO;CAAE,CAAC;CAC5E,gBAAgB,MAAM,eAAe,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS;CACxE,uBAAuB,MAAM,CAC3B,GAAG,KACH;EAAE,MAAM;EAAQ,cAAc,EAAE;EAAS,SAAS,EAAE;CAAO,CAC7D;CAEA,iBAAiB;AACnB,CAAC,CACH;;AAGF,MAAa,mBAAmB,UAC9BA,MAAI,OAAO,OAAO,CAAC,GAAiC,QAAQ;AAa9D,MAAa,kBAAkB,WAC7B,MAAM,MAAM,MAAM,CAAC,CAAC,KAClB,MAAM,KAAK,cAAc,MAAe,GACxC,MAAM,KAAK,kBAAkB,KAAc,GAC3C,MAAM,KAAK,cAAc,MAAe,GACxC,MAAM,QAAQ,OAAO;CAAE,MAAM;CAAY,UAAU,EAAE,MAAM,EAAE,KAAK;AAAE,EAAE,CACxE;AASF,MAAM,kBAAkB,UACtB,MAAM,YAAY,KAAA,IACd,QACA;CACE,GAAG;CACH,SAAS,MAAM,QAAQ,KAAK,MAC1B,EAAE,kBAAkB,iBAAiB;EAAE,GAAG;EAAG,eAAe;CAAS,IAAI,CAC3E;AACF;AAEN,MAAa,eAAe,MAC1BC,cAAkB,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,cAAc,CAAC"}
@@ -1 +1 @@
1
- export { };
1
+ export {}
@@ -1,5 +1,5 @@
1
1
  import { accumulatorToTurn, applyChunk, emptyAccumulator, itemsToMessages, toolChoiceWire } from "./codec.mjs";
2
- import { n as describe, r as it, t as globalExpect } from "./test.DNmyFkvJ-CPKukVWS.mjs";
2
+ import { n as describe, r as it, t as globalExpect } from "./test.DNmyFkvJ-N3QqMRwZ.mjs";
3
3
  //#region src/codec.test.ts
4
4
  describe("itemsToMessages", () => {
5
5
  it("folds tool calls onto the assistant message and emits tool results", () => {
@@ -1 +1 @@
1
- {"version":3,"file":"codec.test.mjs","names":[],"sources":["../src/codec.test.ts"],"sourcesContent":["import type { HistoryItem } from \"@effect-uai/core/Items\"\nimport { describe, expect, it } from \"vitest\"\nimport {\n type Accumulator,\n accumulatorToTurn,\n applyChunk,\n emptyAccumulator,\n itemsToMessages,\n toolChoiceWire,\n type WireChunk,\n} from \"./codec.js\"\n\ndescribe(\"itemsToMessages\", () => {\n // The interesting case: our flat history (assistant message, then separate\n // function_call items) must fold into the OpenAI/Mistral shape where the\n // tool calls ride the assistant message and each result is a `tool` message.\n it(\"folds tool calls onto the assistant message and emits tool results\", () => {\n const history: ReadonlyArray<HistoryItem> = [\n { type: \"message\", role: \"assistant\", content: [{ type: \"output_text\", text: \"checking\" }] },\n { type: \"function_call\", call_id: \"c1\", name: \"a\", arguments: \"{}\" },\n { type: \"function_call\", call_id: \"c2\", name: \"b\", arguments: \"{}\" },\n { type: \"function_call_output\", call_id: \"c1\", output: \"ra\" },\n ]\n expect(itemsToMessages(history)).toEqual([\n {\n role: \"assistant\",\n content: \"checking\",\n tool_calls: [\n { id: \"c1\", type: \"function\", function: { name: \"a\", arguments: \"{}\" } },\n { id: \"c2\", type: \"function\", function: { name: \"b\", arguments: \"{}\" } },\n ],\n },\n { role: \"tool\", tool_call_id: \"c1\", content: \"ra\" },\n ])\n })\n\n it(\"encodes a message with an image as multimodal parts\", () => {\n const history: ReadonlyArray<HistoryItem> = [\n {\n type: \"message\",\n role: \"user\",\n content: [\n { type: \"input_text\", text: \"what is this\" },\n { type: \"input_image\", source: { _tag: \"url\", url: \"https://x/y.png\" } },\n ],\n },\n ]\n expect(itemsToMessages(history)).toEqual([\n {\n role: \"user\",\n content: [\n { type: \"text\", text: \"what is this\" },\n { type: \"image_url\", image_url: \"https://x/y.png\" },\n ],\n },\n ])\n })\n})\n\nit(\"toolChoiceWire maps 'required' to Mistral's 'any'\", () => {\n // Mistral diverges from OpenAI here; the rest pass through unchanged.\n expect(toolChoiceWire(\"required\")).toBe(\"any\")\n})\n\n// Run a sequence of chunks through the accumulator, collecting event tags.\nconst runChunks = (\n chunks: ReadonlyArray<WireChunk>,\n): { acc: Accumulator; tags: ReadonlyArray<string> } => {\n let acc = emptyAccumulator\n const tags: Array<string> = []\n for (const chunk of chunks) {\n const [next, events] = applyChunk(acc, chunk)\n acc = next\n for (const e of events) tags.push(e._tag)\n }\n return { acc, tags }\n}\n\ndescribe(\"streaming accumulation\", () => {\n it(\"accumulates text deltas + usage into an assistant turn\", () => {\n const { acc, tags } = runChunks([\n { choices: [{ delta: { content: \"Hel\" } }] },\n { choices: [{ delta: { content: \"lo\" } }] },\n { choices: [{ delta: {}, finish_reason: \"stop\" }] },\n { usage: { prompt_tokens: 3, completion_tokens: 2, total_tokens: 5 } },\n ])\n expect(tags).toEqual([\"TextDelta\", \"TextDelta\", \"UsageUpdate\"])\n const turn = accumulatorToTurn(acc)\n expect(turn.items).toEqual([\n { type: \"message\", role: \"assistant\", content: [{ type: \"output_text\", text: \"Hello\" }] },\n ])\n expect(turn.usage).toEqual({ input_tokens: 3, output_tokens: 2, total_tokens: 5 })\n expect(turn.stop_reason).toBe(\"stop\")\n })\n\n it(\"stitches a tool call split across chunks\", () => {\n const { acc, tags } = runChunks([\n {\n choices: [\n {\n delta: {\n tool_calls: [\n { index: 0, id: \"c1\", function: { name: \"get_weather\", arguments: '{\"ci' } },\n ],\n },\n },\n ],\n },\n {\n choices: [{ delta: { tool_calls: [{ index: 0, function: { arguments: 'ty\":\"NYC\"}' } }] } }],\n },\n { choices: [{ delta: {}, finish_reason: \"tool_calls\" }] },\n ])\n expect(tags).toEqual([\"ToolCallStart\", \"ToolCallArgsDelta\", \"ToolCallArgsDelta\"])\n const turn = accumulatorToTurn(acc)\n expect(turn.items).toEqual([\n { type: \"function_call\", call_id: \"c1\", name: \"get_weather\", arguments: '{\"city\":\"NYC\"}' },\n ])\n expect(turn.stop_reason).toBe(\"tool_calls\")\n })\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"codec.test.mjs","names":[],"sources":["../src/codec.test.ts"],"sourcesContent":["import type { HistoryItem } from \"@effect-uai/core/Items\"\nimport { describe, expect, it } from \"vitest\"\nimport {\n type Accumulator,\n accumulatorToTurn,\n applyChunk,\n emptyAccumulator,\n itemsToMessages,\n toolChoiceWire,\n type WireChunk,\n} from \"./codec.js\"\n\ndescribe(\"itemsToMessages\", () => {\n // The interesting case: our flat history (assistant message, then separate\n // function_call items) must fold into the OpenAI/Mistral shape where the\n // tool calls ride the assistant message and each result is a `tool` message.\n it(\"folds tool calls onto the assistant message and emits tool results\", () => {\n const history: ReadonlyArray<HistoryItem> = [\n { type: \"message\", role: \"assistant\", content: [{ type: \"output_text\", text: \"checking\" }] },\n { type: \"function_call\", call_id: \"c1\", name: \"a\", arguments: \"{}\" },\n { type: \"function_call\", call_id: \"c2\", name: \"b\", arguments: \"{}\" },\n { type: \"function_call_output\", call_id: \"c1\", output: \"ra\" },\n ]\n expect(itemsToMessages(history)).toEqual([\n {\n role: \"assistant\",\n content: \"checking\",\n tool_calls: [\n { id: \"c1\", type: \"function\", function: { name: \"a\", arguments: \"{}\" } },\n { id: \"c2\", type: \"function\", function: { name: \"b\", arguments: \"{}\" } },\n ],\n },\n { role: \"tool\", tool_call_id: \"c1\", content: \"ra\" },\n ])\n })\n\n it(\"encodes a message with an image as multimodal parts\", () => {\n const history: ReadonlyArray<HistoryItem> = [\n {\n type: \"message\",\n role: \"user\",\n content: [\n { type: \"input_text\", text: \"what is this\" },\n { type: \"input_image\", source: { _tag: \"url\", url: \"https://x/y.png\" } },\n ],\n },\n ]\n expect(itemsToMessages(history)).toEqual([\n {\n role: \"user\",\n content: [\n { type: \"text\", text: \"what is this\" },\n { type: \"image_url\", image_url: \"https://x/y.png\" },\n ],\n },\n ])\n })\n})\n\nit(\"toolChoiceWire maps 'required' to Mistral's 'any'\", () => {\n // Mistral diverges from OpenAI here; the rest pass through unchanged.\n expect(toolChoiceWire(\"required\")).toBe(\"any\")\n})\n\n// Run a sequence of chunks through the accumulator, collecting event tags.\nconst runChunks = (\n chunks: ReadonlyArray<WireChunk>,\n): { acc: Accumulator; tags: ReadonlyArray<string> } => {\n let acc = emptyAccumulator\n const tags: Array<string> = []\n for (const chunk of chunks) {\n const [next, events] = applyChunk(acc, chunk)\n acc = next\n for (const e of events) tags.push(e._tag)\n }\n return { acc, tags }\n}\n\ndescribe(\"streaming accumulation\", () => {\n it(\"accumulates text deltas + usage into an assistant turn\", () => {\n const { acc, tags } = runChunks([\n { choices: [{ delta: { content: \"Hel\" } }] },\n { choices: [{ delta: { content: \"lo\" } }] },\n { choices: [{ delta: {}, finish_reason: \"stop\" }] },\n { usage: { prompt_tokens: 3, completion_tokens: 2, total_tokens: 5 } },\n ])\n expect(tags).toEqual([\"TextDelta\", \"TextDelta\", \"UsageUpdate\"])\n const turn = accumulatorToTurn(acc)\n expect(turn.items).toEqual([\n { type: \"message\", role: \"assistant\", content: [{ type: \"output_text\", text: \"Hello\" }] },\n ])\n expect(turn.usage).toEqual({ input_tokens: 3, output_tokens: 2, total_tokens: 5 })\n expect(turn.stop_reason).toBe(\"stop\")\n })\n\n it(\"stitches a tool call split across chunks\", () => {\n const { acc, tags } = runChunks([\n {\n choices: [\n {\n delta: {\n tool_calls: [\n { index: 0, id: \"c1\", function: { name: \"get_weather\", arguments: '{\"ci' } },\n ],\n },\n },\n ],\n },\n {\n choices: [{ delta: { tool_calls: [{ index: 0, function: { arguments: 'ty\":\"NYC\"}' } }] } }],\n },\n { choices: [{ delta: {}, finish_reason: \"tool_calls\" }] },\n ])\n expect(tags).toEqual([\"ToolCallStart\", \"ToolCallArgsDelta\", \"ToolCallArgsDelta\"])\n const turn = accumulatorToTurn(acc)\n expect(turn.items).toEqual([\n { type: \"function_call\", call_id: \"c1\", name: \"get_weather\", arguments: '{\"city\":\"NYC\"}' },\n ])\n expect(turn.stop_reason).toBe(\"tool_calls\")\n })\n})\n"],"mappings":"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"}
package/dist/http.d.mts CHANGED
@@ -1,5 +1,4 @@
1
1
  import * as AiError from "@effect-uai/core/AiError";
2
-
3
2
  //#region src/http.d.ts
4
3
  /** Map an HTTP status from any Mistral endpoint to an `AiError` variant. */
5
4
  declare const httpStatusError: (status: number, body: string) => AiError.AiError;
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.mts","names":[],"sources":["../src/http.ts"],"mappings":";;;;cAIa,eAAA,GAAkB,MAAA,UAAgB,IAAA,aAAiB,OAAA,CAAQ,OAAA;AAAA,cAwC3D,gBAAA,GAAoB,KAAA,cAAiB,OAAA,CAAQ,OAAA"}
1
+ {"version":3,"file":"http.d.mts","names":[],"sources":["../src/http.ts"],"mappings":";;;cAIa,kBAAkB,gBAAgB,iBAAiB,QAAQ;cAwC3D,mBAAgB,mBAAqB,QAAQ"}
package/dist/http.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"http.mjs","names":[],"sources":["../src/http.ts"],"sourcesContent":["import { Match } from \"effect\"\nimport * as AiError from \"@effect-uai/core/AiError\"\n\n/** Map an HTTP status from any Mistral endpoint to an `AiError` variant. */\nexport const httpStatusError: (status: number, body: string) => AiError.AiError = (status, body) =>\n Match.value(status).pipe(\n Match.when(\n 429,\n (): AiError.AiError => new AiError.RateLimited({ provider: \"mistral\", raw: body }),\n ),\n Match.whenOr(\n 408,\n 504,\n (): AiError.AiError => new AiError.Timeout({ provider: \"mistral\", raw: body }),\n ),\n Match.when(\n 401,\n (): AiError.AiError =>\n new AiError.AuthFailed({ provider: \"mistral\", subtype: \"auth\", raw: body }),\n ),\n Match.when(\n 403,\n (): AiError.AiError =>\n new AiError.AuthFailed({ provider: \"mistral\", subtype: \"permission\", raw: body }),\n ),\n Match.when(\n 402,\n (): AiError.AiError =>\n new AiError.AuthFailed({ provider: \"mistral\", subtype: \"billing\", raw: body }),\n ),\n Match.when(\n 413,\n (): AiError.AiError => new AiError.ContextLengthExceeded({ provider: \"mistral\", raw: body }),\n ),\n Match.when(\n (n) => n >= 500,\n (n): AiError.AiError =>\n new AiError.Unavailable({ provider: \"mistral\", status: n, raw: body }),\n ),\n Match.orElse(\n (): AiError.AiError => new AiError.InvalidRequest({ provider: \"mistral\", raw: body }),\n ),\n )\n\nexport const transportFailure = (cause: unknown): AiError.AiError =>\n new AiError.Unavailable({ provider: \"mistral\", raw: cause })\n"],"mappings":";;;;AAIA,MAAa,mBAAsE,QAAQ,SACzF,MAAM,MAAM,OAAO,CAAC,KAClB,MAAM,KACJ,WACuB,IAAI,QAAQ,YAAY;CAAE,UAAU;CAAW,KAAK;CAAM,CAAC,CACnF,EACD,MAAM,OACJ,KACA,WACuB,IAAI,QAAQ,QAAQ;CAAE,UAAU;CAAW,KAAK;CAAM,CAAC,CAC/E,EACD,MAAM,KACJ,WAEE,IAAI,QAAQ,WAAW;CAAE,UAAU;CAAW,SAAS;CAAQ,KAAK;CAAM,CAAC,CAC9E,EACD,MAAM,KACJ,WAEE,IAAI,QAAQ,WAAW;CAAE,UAAU;CAAW,SAAS;CAAc,KAAK;CAAM,CAAC,CACpF,EACD,MAAM,KACJ,WAEE,IAAI,QAAQ,WAAW;CAAE,UAAU;CAAW,SAAS;CAAW,KAAK;CAAM,CAAC,CACjF,EACD,MAAM,KACJ,WACuB,IAAI,QAAQ,sBAAsB;CAAE,UAAU;CAAW,KAAK;CAAM,CAAC,CAC7F,EACD,MAAM,MACH,MAAM,KAAK,MACX,MACC,IAAI,QAAQ,YAAY;CAAE,UAAU;CAAW,QAAQ;CAAG,KAAK;CAAM,CAAC,CACzE,EACD,MAAM,aACmB,IAAI,QAAQ,eAAe;CAAE,UAAU;CAAW,KAAK;CAAM,CAAC,CACtF,CACF;AAEH,MAAa,oBAAoB,UAC/B,IAAI,QAAQ,YAAY;CAAE,UAAU;CAAW,KAAK;CAAO,CAAC"}
1
+ {"version":3,"file":"http.mjs","names":[],"sources":["../src/http.ts"],"sourcesContent":["import { Match } from \"effect\"\nimport * as AiError from \"@effect-uai/core/AiError\"\n\n/** Map an HTTP status from any Mistral endpoint to an `AiError` variant. */\nexport const httpStatusError: (status: number, body: string) => AiError.AiError = (status, body) =>\n Match.value(status).pipe(\n Match.when(\n 429,\n (): AiError.AiError => new AiError.RateLimited({ provider: \"mistral\", raw: body }),\n ),\n Match.whenOr(\n 408,\n 504,\n (): AiError.AiError => new AiError.Timeout({ provider: \"mistral\", raw: body }),\n ),\n Match.when(\n 401,\n (): AiError.AiError =>\n new AiError.AuthFailed({ provider: \"mistral\", subtype: \"auth\", raw: body }),\n ),\n Match.when(\n 403,\n (): AiError.AiError =>\n new AiError.AuthFailed({ provider: \"mistral\", subtype: \"permission\", raw: body }),\n ),\n Match.when(\n 402,\n (): AiError.AiError =>\n new AiError.AuthFailed({ provider: \"mistral\", subtype: \"billing\", raw: body }),\n ),\n Match.when(\n 413,\n (): AiError.AiError => new AiError.ContextLengthExceeded({ provider: \"mistral\", raw: body }),\n ),\n Match.when(\n (n) => n >= 500,\n (n): AiError.AiError =>\n new AiError.Unavailable({ provider: \"mistral\", status: n, raw: body }),\n ),\n Match.orElse(\n (): AiError.AiError => new AiError.InvalidRequest({ provider: \"mistral\", raw: body }),\n ),\n )\n\nexport const transportFailure = (cause: unknown): AiError.AiError =>\n new AiError.Unavailable({ provider: \"mistral\", raw: cause })\n"],"mappings":";;;;AAIA,MAAa,mBAAsE,QAAQ,SACzF,MAAM,MAAM,MAAM,CAAC,CAAC,KAClB,MAAM,KACJ,WACuB,IAAI,QAAQ,YAAY;CAAE,UAAU;CAAW,KAAK;AAAK,CAAC,CACnF,GACA,MAAM,OACJ,KACA,WACuB,IAAI,QAAQ,QAAQ;CAAE,UAAU;CAAW,KAAK;AAAK,CAAC,CAC/E,GACA,MAAM,KACJ,WAEE,IAAI,QAAQ,WAAW;CAAE,UAAU;CAAW,SAAS;CAAQ,KAAK;AAAK,CAAC,CAC9E,GACA,MAAM,KACJ,WAEE,IAAI,QAAQ,WAAW;CAAE,UAAU;CAAW,SAAS;CAAc,KAAK;AAAK,CAAC,CACpF,GACA,MAAM,KACJ,WAEE,IAAI,QAAQ,WAAW;CAAE,UAAU;CAAW,SAAS;CAAW,KAAK;AAAK,CAAC,CACjF,GACA,MAAM,KACJ,WACuB,IAAI,QAAQ,sBAAsB;CAAE,UAAU;CAAW,KAAK;AAAK,CAAC,CAC7F,GACA,MAAM,MACH,MAAM,KAAK,MACX,MACC,IAAI,QAAQ,YAAY;CAAE,UAAU;CAAW,QAAQ;CAAG,KAAK;AAAK,CAAC,CACzE,GACA,MAAM,aACmB,IAAI,QAAQ,eAAe;CAAE,UAAU;CAAW,KAAK;AAAK,CAAC,CACtF,CACF;AAEF,MAAa,oBAAoB,UAC/B,IAAI,QAAQ,YAAY;CAAE,UAAU;CAAW,KAAK;AAAM,CAAC"}
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { i as MistralTtsModel, n as MistralRealtimeModel, r as MistralTranscribeModel, t as MistralModel } from "./models-B1wZuvz5.mjs";
1
+ import { i as MistralTtsModel, n as MistralRealtimeModel, r as MistralTranscribeModel, t as MistralModel } from "./models-gP7kSqeb.mjs";
2
2
  import { t as Mistral_d_exports } from "./Mistral.mjs";
3
3
  import { t as MistralTranscriber_d_exports } from "./MistralTranscriber.mjs";
4
4
  import { t as MistralRealtimeTranscriber_d_exports } from "./MistralRealtimeTranscriber.mjs";
@@ -2,8 +2,8 @@
2
2
  var comma = ",".charCodeAt(0);
3
3
  var semicolon = ";".charCodeAt(0);
4
4
  var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
5
- var intToChar = new Uint8Array(64);
6
- var charToInt = new Uint8Array(128);
5
+ var intToChar = /* @__PURE__ */ new Uint8Array(64);
6
+ var charToInt = /* @__PURE__ */ new Uint8Array(128);
7
7
  for (let i = 0; i < chars.length; i++) {
8
8
  const c = chars.charCodeAt(i);
9
9
  intToChar[i] = c;
@@ -20,7 +20,7 @@ function encodeInteger(builder, num, relative) {
20
20
  } while (delta > 0);
21
21
  return num;
22
22
  }
23
- var bufLength = 1024 * 16;
23
+ var bufLength = 16384;
24
24
  var td = typeof TextDecoder !== "undefined" ? /* @__PURE__ */ new TextDecoder() : typeof Buffer !== "undefined" ? { decode(buf) {
25
25
  return Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength).toString();
26
26
  } } : { decode(buf) {
@@ -218,7 +218,7 @@ function getBtoa() {
218
218
  throw new Error("Unsupported environment: `window.btoa` or `Buffer` should be supported.");
219
219
  };
220
220
  }
221
- const btoa = /* @__PURE__ */ getBtoa();
221
+ const btoa = /*#__PURE__*/ getBtoa();
222
222
  var SourceMap = class {
223
223
  constructor(properties) {
224
224
  this.version = 3;
@@ -355,16 +355,17 @@ var Mappings = class {
355
355
  loc.line,
356
356
  loc.column
357
357
  ];
358
- if (this.hires === "boundary") if (wordRegex.test(original[originalCharIndex])) {
359
- if (!charInHiresBoundary) {
358
+ if (this.hires === "boundary") {
359
+ if (wordRegex.test(original[originalCharIndex])) {
360
+ if (!charInHiresBoundary) {
361
+ this.rawSegments.push(segment);
362
+ charInHiresBoundary = true;
363
+ }
364
+ } else {
360
365
  this.rawSegments.push(segment);
361
- charInHiresBoundary = true;
366
+ charInHiresBoundary = false;
362
367
  }
363
- } else {
364
- this.rawSegments.push(segment);
365
- charInHiresBoundary = false;
366
- }
367
- else this.rawSegments.push(segment);
368
+ } else this.rawSegments.push(segment);
368
369
  }
369
370
  loc.column += 1;
370
371
  this.generatedCodeColumn += 1;
@@ -1010,4 +1011,4 @@ var MagicString = class MagicString {
1010
1011
  //#endregion
1011
1012
  export { MagicString as default };
1012
1013
 
1013
- //# sourceMappingURL=magic-string.es-CaWgF-3p.mjs.map
1014
+ //# sourceMappingURL=magic-string.es-CUAnjKYC.mjs.map