@effect-uai/mistral 0.17.0 → 0.19.0-dev-20261109183959

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 (57) hide show
  1. package/README.md +4 -4
  2. package/dist/Mistral.d.mts +1 -1
  3. package/dist/Mistral.d.mts.map +1 -1
  4. package/dist/Mistral.mjs +4 -3
  5. package/dist/Mistral.mjs.map +1 -1
  6. package/dist/MistralRealtimeTranscriber.d.mts +2 -2
  7. package/dist/MistralRealtimeTranscriber.mjs +2 -2
  8. package/dist/MistralRealtimeTranscriber.mjs.map +1 -1
  9. package/dist/MistralSynthesizer.d.mts +1 -1
  10. package/dist/MistralSynthesizer.d.mts.map +1 -1
  11. package/dist/MistralSynthesizer.mjs +5 -4
  12. package/dist/MistralSynthesizer.mjs.map +1 -1
  13. package/dist/MistralTranscriber.d.mts +1 -1
  14. package/dist/MistralTranscriber.mjs +2 -2
  15. package/dist/MistralTranscriber.mjs.map +1 -1
  16. package/dist/audioCodec.d.mts.map +1 -1
  17. package/dist/audioCodec.mjs +3 -2
  18. package/dist/audioCodec.mjs.map +1 -1
  19. package/dist/codec.d.mts +3 -3
  20. package/dist/codec.d.mts.map +1 -1
  21. package/dist/codec.mjs +8 -6
  22. package/dist/codec.mjs.map +1 -1
  23. package/dist/codec.test.mjs +9 -3
  24. package/dist/codec.test.mjs.map +1 -1
  25. package/dist/dist-DHer1cql.mjs +1533 -0
  26. package/dist/dist-DHer1cql.mjs.map +1 -0
  27. package/dist/http.d.mts +1 -1
  28. package/dist/http.mjs.map +1 -1
  29. package/dist/{test.DNmyFkvJ-N3QqMRwZ.mjs → index.C4tKZ0yW-CUBm3Bmz.mjs} +9446 -5818
  30. package/dist/index.C4tKZ0yW-CUBm3Bmz.mjs.map +1 -0
  31. package/dist/onHalt.test.mjs +2 -2
  32. package/dist/onHalt.test.mjs.map +1 -1
  33. package/dist/{realtimeStt-BcthMc57.d.mts → realtimeStt-CcuQ6EZS.d.mts} +7 -1
  34. package/dist/realtimeStt-CcuQ6EZS.d.mts.map +1 -0
  35. package/dist/realtimeStt.d.mts +1 -1
  36. package/dist/realtimeStt.mjs +27 -30
  37. package/dist/realtimeStt.mjs.map +1 -1
  38. package/dist/realtimeStt.test.d.mts +1 -0
  39. package/dist/realtimeStt.test.mjs +317 -0
  40. package/dist/realtimeStt.test.mjs.map +1 -0
  41. package/dist/{rolldown-runtime-D7D4PA-g.mjs → rolldown-runtime-EAsCxrDo.mjs} +2 -1
  42. package/package.json +6 -6
  43. package/src/Mistral.ts +3 -1
  44. package/src/MistralRealtimeTranscriber.ts +1 -1
  45. package/src/MistralSynthesizer.ts +4 -13
  46. package/src/MistralTranscriber.ts +1 -1
  47. package/src/audioCodec.ts +3 -2
  48. package/src/codec.test.ts +9 -2
  49. package/src/codec.ts +6 -3
  50. package/src/http.ts +1 -1
  51. package/src/onHalt.test.ts +1 -1
  52. package/src/realtimeStt.test.ts +116 -0
  53. package/src/realtimeStt.ts +68 -64
  54. package/dist/magic-string.es-CUAnjKYC.mjs +0 -1014
  55. package/dist/magic-string.es-CUAnjKYC.mjs.map +0 -1
  56. package/dist/realtimeStt-BcthMc57.d.mts.map +0 -1
  57. package/dist/test.DNmyFkvJ-N3QqMRwZ.mjs.map +0 -1
@@ -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":";;;AAYA,SAAS,yBAAyB;CAIhC,GAAG,4EAA4E;EAO7E,aAAO,gBAAgB;GALrB;IAAE,MAAM;IAAW,MAAM;IAAa,SAAS,CAAC;KAAE,MAAM;KAAe,MAAM;IAAW,CAAC;GAAE;GAC3F;IAAE,MAAM;IAAiB,SAAS;IAAM,MAAM;IAAK,WAAW;GAAK;GACnE;IAAE,MAAM;IAAiB,SAAS;IAAM,MAAM;IAAK,WAAW;GAAK;GACnE;IAAE,MAAM;IAAwB,SAAS;IAAM,QAAQ;GAAK;EAEjC,CAAC,CAAC,CAAC,CAAC,QAAQ,CACvC;GACE,MAAM;GACN,SAAS;GACT,YAAY,CACV;IAAE,IAAI;IAAM,MAAM;IAAY,UAAU;KAAE,MAAM;KAAK,WAAW;IAAK;GAAE,GACvE;IAAE,IAAI;IAAM,MAAM;IAAY,UAAU;KAAE,MAAM;KAAK,WAAW;IAAK;GAAE,CACzE;EACF,GACA;GAAE,MAAM;GAAQ,cAAc;GAAM,SAAS;EAAK,CACpD,CAAC;CACH,CAAC;CAED,GAAG,6DAA6D;EAW9D,aAAO,gBAAgB,CATrB;GACE,MAAM;GACN,MAAM;GACN,SAAS,CACP;IAAE,MAAM;IAAc,MAAM;GAAe,GAC3C;IAAE,MAAM;IAAe,QAAQ;KAAE,MAAM;KAAO,KAAK;IAAkB;GAAE,CACzE;EACF,CAE2B,CAAC,CAAC,CAAC,CAAC,QAAQ,CACvC;GACE,MAAM;GACN,SAAS,CACP;IAAE,MAAM;IAAQ,MAAM;GAAe,GACrC;IAAE,MAAM;IAAa,WAAW;GAAkB,CACpD;EACF,CACF,CAAC;CACH,CAAC;AACH,CAAC;AAED,GAAG,2DAA2D;CAE5D,aAAO,eAAe,UAAU,CAAC,CAAC,CAAC,KAAK,KAAK;AAC/C,CAAC;AAGD,MAAM,aACJ,WACsD;CACtD,IAAI,MAAM;CACV,MAAM,OAAsB,CAAC;CAC7B,KAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,CAAC,MAAM,UAAU,WAAW,KAAK,KAAK;EAC5C,MAAM;EACN,KAAK,MAAM,KAAK,QAAQ,KAAK,KAAK,EAAE,IAAI;CAC1C;CACA,OAAO;EAAE;EAAK;CAAK;AACrB;AAEA,SAAS,gCAAgC;CACvC,GAAG,gEAAgE;EACjE,MAAM,EAAE,KAAK,SAAS,UAAU;GAC9B,EAAE,SAAS,CAAC,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC,EAAE;GAC3C,EAAE,SAAS,CAAC,EAAE,OAAO,EAAE,SAAS,KAAK,EAAE,CAAC,EAAE;GAC1C,EAAE,SAAS,CAAC;IAAE,OAAO,CAAC;IAAG,eAAe;GAAO,CAAC,EAAE;GAClD,EAAE,OAAO;IAAE,eAAe;IAAG,mBAAmB;IAAG,cAAc;GAAE,EAAE;EACvE,CAAC;EACD,aAAO,IAAI,CAAC,CAAC,QAAQ;GAAC;GAAa;GAAa;EAAa,CAAC;EAC9D,MAAM,OAAO,kBAAkB,GAAG;EAClC,aAAO,KAAK,KAAK,CAAC,CAAC,QAAQ,CACzB;GAAE,MAAM;GAAW,MAAM;GAAa,SAAS,CAAC;IAAE,MAAM;IAAe,MAAM;GAAQ,CAAC;EAAE,CAC1F,CAAC;EACD,aAAO,KAAK,KAAK,CAAC,CAAC,QAAQ;GAAE,cAAc;GAAG,eAAe;GAAG,cAAc;EAAE,CAAC;EACjF,aAAO,KAAK,WAAW,CAAC,CAAC,KAAK,MAAM;CACtC,CAAC;CAED,GAAG,kDAAkD;EACnD,MAAM,EAAE,KAAK,SAAS,UAAU;GAC9B,EACE,SAAS,CACP,EACE,OAAO,EACL,YAAY,CACV;IAAE,OAAO;IAAG,IAAI;IAAM,UAAU;KAAE,MAAM;KAAe,WAAW;IAAO;GAAE,CAC7E,EACF,EACF,CACF,EACF;GACA,EACE,SAAS,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC;IAAE,OAAO;IAAG,UAAU,EAAE,WAAW,gBAAa;GAAE,CAAC,EAAE,EAAE,CAAC,EAC5F;GACA,EAAE,SAAS,CAAC;IAAE,OAAO,CAAC;IAAG,eAAe;GAAa,CAAC,EAAE;EAC1D,CAAC;EACD,aAAO,IAAI,CAAC,CAAC,QAAQ;GAAC;GAAiB;GAAqB;EAAmB,CAAC;EAChF,MAAM,OAAO,kBAAkB,GAAG;EAClC,aAAO,KAAK,KAAK,CAAC,CAAC,QAAQ,CACzB;GAAE,MAAM;GAAiB,SAAS;GAAM,MAAM;GAAe,WAAW;EAAiB,CAC3F,CAAC;EACD,aAAO,KAAK,WAAW,CAAC,CAAC,KAAK,YAAY;CAC5C,CAAC;AACH,CAAC"}
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 {\n type: \"function_call_output\",\n call_id: \"c1\",\n output: [\n { type: \"input_text\", text: \"ra\" },\n { type: \"input_json\", value: { n: 1 } },\n ],\n },\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\":1}' },\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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"}