v0.6.0
@effect-uai/core
Minor Changes
-
a332f0a: 0.6 bundles one large-but-mechanical naming sweep with a set of
additive features. The breaking part is source-level only — the wire
format is unchanged (function_call/function_call_outputstill
go out on the wire, so no provider payloads change). Almost every
rewrite is find-and-replace; the full before/after diffs and the
recommended order live in Migrating to 0.6.Breaking: "function call" → "tool call" terminology
Every public name that said "function call" now says "tool call":
Item→HistoryItem;FunctionCall→ToolCall;
FunctionCallOutput→ToolCallOutput.Items.functionCallOutput→Items.toolCallOutput;
Items.isFunctionCall→Items.isToolCall;
Items.isFunctionCallOutput→Items.isToolCallOutput.Turn.functionCalls→Turn.getToolCalls.
Breaking: module renames
@effect-uai/core/Outcome→@effect-uai/core/ToolResult. Also
ToolResult.Value→ToolResult.Ok,isValue→isOk,
rejected(...)→failed(...),toFunctionCallOutput→
toToolCallOutput.@effect-uai/core/Resolvers→@effect-uai/core/Approval. Also
fromApprovalMap→fromMap,fromVerdictQueue→fromQueue,
ToolCallDecision→ApprovalDecision, and the queue helper's
announcefield →approvalRequests.
Breaking: Turn / Toolkit / Tool / ToolEvent renames
Turn.appendTurn→Turn.appendToHistory.Turn.toStructured→Turn.decodeStructured.Toolkit.executeAll→Toolkit.run.Toolkit.continueWith→Toolkit.continueWithResults.Toolkit.make(...)+Toolkit.toDescriptors(kit)→ just
Tool.toDescriptors([...]). The homogeneous-toolkit wrapper is gone.Tool.AnyKindTool→Tool.AnyTool.ToolEvent.Intermediate→ToolEvent.Progress;
isIntermediate→isProgress.
Breaking: Loop helper trim
Loop.loopFrom(...)→Loop.loopOver(...).Loop.Event<A, S>→Loop.Step<A, S>.return stop→return stop().Loop.stopWith(state)→Loop.stop(state).nextAfter/stopAfter/stopWithAfter/stopEvent/
nextAfterFoldare removed — compose withStream.concatinstead.
See the migration doc for one-line replacements.
Additive: new Toolkit / Loop helpers
Toolkit.appendToolResults(state, turn)— shorthand for the canonical
continueWithResultsbody that folds tool results into history.Toolkit.collectResults— lower-level drain of aStream<ToolEvent>
to itsToolResults without advancing the loop.Loop.emitValues(stream)/Loop.emitNext(effect)— fork-helper
building blocks behindToolkit.continueWithResults.
Additive: sandboxes
A new
Sandboxcapability in@effect-uai/core/sandboxfor running
untrusted code, commands, or LLM-generated scripts inside an isolated
microVM. Two new provider packages ship behind the same
SandboxService:@effect-uai/microsandbox— local Firecracker microVMs via
microsandbox.@effect-uai/deno— hosted Firecracker microVMs on
Deno Deploy.
Both cover
create/exec/execStream/ volumes / snapshots /
network policies / bound secrets / OCI image references. The
recipes-extras/sandbox-code-interpreterrecipe shows the "run, fix,
repeat" pattern.Additive: new recipes
sleeper-agent— long-lived background agent waking on scheduled
triggers.external-task-polling— drive the loop from an external task
queue.sandbox-code-interpreter(inrecipes-extras/) — agent writes
Python, sandbox runs it, stderr feeds back into the next turn.
-
a332f0a: Multi-speaker dialogue + custom pronunciations on
SpeechSynthesizer:- New optional
pronunciations?: ReadonlyArray<CustomPronunciation>on
CommonSynthesizeRequest. New typesPhoneticEncoding
("ipa" | "x-sampa" | "cmu-arpabet") andCustomPronunciation
({phrase, pronunciation, encoding}). Adapters that can't honor an
entry silently drop it; audio still renders with the default
pronunciation. - New methods
synthesizeDialogueandstreamSynthesizeDialogueon
SpeechSynthesizerService, takingCommonSynthesizeDialogueRequest
({model, turns, outputFormat?, languageCode?, pronunciations?}).
DialogueTurnis{voiceId, text, styleDescription?, speed?}. - New capability marker
MultiSpeakerTts— shipped only by provider
Layers with native dialogue support. Top-level helpers
synthesizeDialogue/streamSynthesizeDialoguerequire it inR,
so providers without dialogue support fail at compile time. Mirrors
the existingTtsIncrementalTextpattern. MockSpeechSynthesizerextended withdialogueBlobsand
streamSynthesizeDialogueChunksscript fields plus a new
layerWithoutMultiSpeakervariant for testing the marker.
Non-breaking: every existing call site continues to compile.
- New optional
effect-uai
Minor Changes
-
a332f0a: 0.6 bundles one large-but-mechanical naming sweep with a set of
additive features. The breaking part is source-level only — the wire
format is unchanged (function_call/function_call_outputstill
go out on the wire, so no provider payloads change). Almost every
rewrite is find-and-replace; the full before/after diffs and the
recommended order live in Migrating to 0.6.Breaking: "function call" → "tool call" terminology
Every public name that said "function call" now says "tool call":
Item→HistoryItem;FunctionCall→ToolCall;
FunctionCallOutput→ToolCallOutput.Items.functionCallOutput→Items.toolCallOutput;
Items.isFunctionCall→Items.isToolCall;
Items.isFunctionCallOutput→Items.isToolCallOutput.Turn.functionCalls→Turn.getToolCalls.
Breaking: module renames
@effect-uai/core/Outcome→@effect-uai/core/ToolResult. Also
ToolResult.Value→ToolResult.Ok,isValue→isOk,
rejected(...)→failed(...),toFunctionCallOutput→
toToolCallOutput.@effect-uai/core/Resolvers→@effect-uai/core/Approval. Also
fromApprovalMap→fromMap,fromVerdictQueue→fromQueue,
ToolCallDecision→ApprovalDecision, and the queue helper's
announcefield →approvalRequests.
Breaking: Turn / Toolkit / Tool / ToolEvent renames
Turn.appendTurn→Turn.appendToHistory.Turn.toStructured→Turn.decodeStructured.Toolkit.executeAll→Toolkit.run.Toolkit.continueWith→Toolkit.continueWithResults.Toolkit.make(...)+Toolkit.toDescriptors(kit)→ just
Tool.toDescriptors([...]). The homogeneous-toolkit wrapper is gone.Tool.AnyKindTool→Tool.AnyTool.ToolEvent.Intermediate→ToolEvent.Progress;
isIntermediate→isProgress.
Breaking: Loop helper trim
Loop.loopFrom(...)→Loop.loopOver(...).Loop.Event<A, S>→Loop.Step<A, S>.return stop→return stop().Loop.stopWith(state)→Loop.stop(state).nextAfter/stopAfter/stopWithAfter/stopEvent/
nextAfterFoldare removed — compose withStream.concatinstead.
See the migration doc for one-line replacements.
Additive: new Toolkit / Loop helpers
Toolkit.appendToolResults(state, turn)— shorthand for the canonical
continueWithResultsbody that folds tool results into history.Toolkit.collectResults— lower-level drain of aStream<ToolEvent>
to itsToolResults without advancing the loop.Loop.emitValues(stream)/Loop.emitNext(effect)— fork-helper
building blocks behindToolkit.continueWithResults.
Additive: sandboxes
A new
Sandboxcapability in@effect-uai/core/sandboxfor running
untrusted code, commands, or LLM-generated scripts inside an isolated
microVM. Two new provider packages ship behind the same
SandboxService:@effect-uai/microsandbox— local Firecracker microVMs via
microsandbox.@effect-uai/deno— hosted Firecracker microVMs on
Deno Deploy.
Both cover
create/exec/execStream/ volumes / snapshots /
network policies / bound secrets / OCI image references. The
recipes-extras/sandbox-code-interpreterrecipe shows the "run, fix,
repeat" pattern.Additive: new recipes
sleeper-agent— long-lived background agent waking on scheduled
triggers.external-task-polling— drive the loop from an external task
queue.sandbox-code-interpreter(inrecipes-extras/) — agent writes
Python, sandbox runs it, stderr feeds back into the next turn.
@effect-uai/anthropic
Minor Changes
-
a332f0a: 0.6 bundles one large-but-mechanical naming sweep with a set of
additive features. The breaking part is source-level only — the wire
format is unchanged (function_call/function_call_outputstill
go out on the wire, so no provider payloads change). Almost every
rewrite is find-and-replace; the full before/after diffs and the
recommended order live in Migrating to 0.6.Breaking: "function call" → "tool call" terminology
Every public name that said "function call" now says "tool call":
Item→HistoryItem;FunctionCall→ToolCall;
FunctionCallOutput→ToolCallOutput.Items.functionCallOutput→Items.toolCallOutput;
Items.isFunctionCall→Items.isToolCall;
Items.isFunctionCallOutput→Items.isToolCallOutput.Turn.functionCalls→Turn.getToolCalls.
Breaking: module renames
@effect-uai/core/Outcome→@effect-uai/core/ToolResult. Also
ToolResult.Value→ToolResult.Ok,isValue→isOk,
rejected(...)→failed(...),toFunctionCallOutput→
toToolCallOutput.@effect-uai/core/Resolvers→@effect-uai/core/Approval. Also
fromApprovalMap→fromMap,fromVerdictQueue→fromQueue,
ToolCallDecision→ApprovalDecision, and the queue helper's
announcefield →approvalRequests.
Breaking: Turn / Toolkit / Tool / ToolEvent renames
Turn.appendTurn→Turn.appendToHistory.Turn.toStructured→Turn.decodeStructured.Toolkit.executeAll→Toolkit.run.Toolkit.continueWith→Toolkit.continueWithResults.Toolkit.make(...)+Toolkit.toDescriptors(kit)→ just
Tool.toDescriptors([...]). The homogeneous-toolkit wrapper is gone.Tool.AnyKindTool→Tool.AnyTool.ToolEvent.Intermediate→ToolEvent.Progress;
isIntermediate→isProgress.
Breaking: Loop helper trim
Loop.loopFrom(...)→Loop.loopOver(...).Loop.Event<A, S>→Loop.Step<A, S>.return stop→return stop().Loop.stopWith(state)→Loop.stop(state).nextAfter/stopAfter/stopWithAfter/stopEvent/
nextAfterFoldare removed — compose withStream.concatinstead.
See the migration doc for one-line replacements.
Additive: new Toolkit / Loop helpers
Toolkit.appendToolResults(state, turn)— shorthand for the canonical
continueWithResultsbody that folds tool results into history.Toolkit.collectResults— lower-level drain of aStream<ToolEvent>
to itsToolResults without advancing the loop.Loop.emitValues(stream)/Loop.emitNext(effect)— fork-helper
building blocks behindToolkit.continueWithResults.
Additive: sandboxes
A new
Sandboxcapability in@effect-uai/core/sandboxfor running
untrusted code, commands, or LLM-generated scripts inside an isolated
microVM. Two new provider packages ship behind the same
SandboxService:@effect-uai/microsandbox— local Firecracker microVMs via
microsandbox.@effect-uai/deno— hosted Firecracker microVMs on
Deno Deploy.
Both cover
create/exec/execStream/ volumes / snapshots /
network policies / bound secrets / OCI image references. The
recipes-extras/sandbox-code-interpreterrecipe shows the "run, fix,
repeat" pattern.Additive: new recipes
sleeper-agent— long-lived background agent waking on scheduled
triggers.external-task-polling— drive the loop from an external task
queue.sandbox-code-interpreter(inrecipes-extras/) — agent writes
Python, sandbox runs it, stderr feeds back into the next turn.
@effect-uai/deno
Minor Changes
-
a332f0a: 0.6 bundles one large-but-mechanical naming sweep with a set of
additive features. The breaking part is source-level only — the wire
format is unchanged (function_call/function_call_outputstill
go out on the wire, so no provider payloads change). Almost every
rewrite is find-and-replace; the full before/after diffs and the
recommended order live in Migrating to 0.6.Breaking: "function call" → "tool call" terminology
Every public name that said "function call" now says "tool call":
Item→HistoryItem;FunctionCall→ToolCall;
FunctionCallOutput→ToolCallOutput.Items.functionCallOutput→Items.toolCallOutput;
Items.isFunctionCall→Items.isToolCall;
Items.isFunctionCallOutput→Items.isToolCallOutput.Turn.functionCalls→Turn.getToolCalls.
Breaking: module renames
@effect-uai/core/Outcome→@effect-uai/core/ToolResult. Also
ToolResult.Value→ToolResult.Ok,isValue→isOk,
rejected(...)→failed(...),toFunctionCallOutput→
toToolCallOutput.@effect-uai/core/Resolvers→@effect-uai/core/Approval. Also
fromApprovalMap→fromMap,fromVerdictQueue→fromQueue,
ToolCallDecision→ApprovalDecision, and the queue helper's
announcefield →approvalRequests.
Breaking: Turn / Toolkit / Tool / ToolEvent renames
Turn.appendTurn→Turn.appendToHistory.Turn.toStructured→Turn.decodeStructured.Toolkit.executeAll→Toolkit.run.Toolkit.continueWith→Toolkit.continueWithResults.Toolkit.make(...)+Toolkit.toDescriptors(kit)→ just
Tool.toDescriptors([...]). The homogeneous-toolkit wrapper is gone.Tool.AnyKindTool→Tool.AnyTool.ToolEvent.Intermediate→ToolEvent.Progress;
isIntermediate→isProgress.
Breaking: Loop helper trim
Loop.loopFrom(...)→Loop.loopOver(...).Loop.Event<A, S>→Loop.Step<A, S>.return stop→return stop().Loop.stopWith(state)→Loop.stop(state).nextAfter/stopAfter/stopWithAfter/stopEvent/
nextAfterFoldare removed — compose withStream.concatinstead.
See the migration doc for one-line replacements.
Additive: new Toolkit / Loop helpers
Toolkit.appendToolResults(state, turn)— shorthand for the canonical
continueWithResultsbody that folds tool results into history.Toolkit.collectResults— lower-level drain of aStream<ToolEvent>
to itsToolResults without advancing the loop.Loop.emitValues(stream)/Loop.emitNext(effect)— fork-helper
building blocks behindToolkit.continueWithResults.
Additive: sandboxes
A new
Sandboxcapability in@effect-uai/core/sandboxfor running
untrusted code, commands, or LLM-generated scripts inside an isolated
microVM. Two new provider packages ship behind the same
SandboxService:@effect-uai/microsandbox— local Firecracker microVMs via
microsandbox.@effect-uai/deno— hosted Firecracker microVMs on
Deno Deploy.
Both cover
create/exec/execStream/ volumes / snapshots /
network policies / bound secrets / OCI image references. The
recipes-extras/sandbox-code-interpreterrecipe shows the "run, fix,
repeat" pattern.Additive: new recipes
sleeper-agent— long-lived background agent waking on scheduled
triggers.external-task-polling— drive the loop from an external task
queue.sandbox-code-interpreter(inrecipes-extras/) — agent writes
Python, sandbox runs it, stderr feeds back into the next turn.
@effect-uai/elevenlabs
Minor Changes
-
a332f0a: 0.6 bundles one large-but-mechanical naming sweep with a set of
additive features. The breaking part is source-level only — the wire
format is unchanged (function_call/function_call_outputstill
go out on the wire, so no provider payloads change). Almost every
rewrite is find-and-replace; the full before/after diffs and the
recommended order live in Migrating to 0.6.Breaking: "function call" → "tool call" terminology
Every public name that said "function call" now says "tool call":
Item→HistoryItem;FunctionCall→ToolCall;
FunctionCallOutput→ToolCallOutput.Items.functionCallOutput→Items.toolCallOutput;
Items.isFunctionCall→Items.isToolCall;
Items.isFunctionCallOutput→Items.isToolCallOutput.Turn.functionCalls→Turn.getToolCalls.
Breaking: module renames
@effect-uai/core/Outcome→@effect-uai/core/ToolResult. Also
ToolResult.Value→ToolResult.Ok,isValue→isOk,
rejected(...)→failed(...),toFunctionCallOutput→
toToolCallOutput.@effect-uai/core/Resolvers→@effect-uai/core/Approval. Also
fromApprovalMap→fromMap,fromVerdictQueue→fromQueue,
ToolCallDecision→ApprovalDecision, and the queue helper's
announcefield →approvalRequests.
Breaking: Turn / Toolkit / Tool / ToolEvent renames
Turn.appendTurn→Turn.appendToHistory.Turn.toStructured→Turn.decodeStructured.Toolkit.executeAll→Toolkit.run.Toolkit.continueWith→Toolkit.continueWithResults.Toolkit.make(...)+Toolkit.toDescriptors(kit)→ just
Tool.toDescriptors([...]). The homogeneous-toolkit wrapper is gone.Tool.AnyKindTool→Tool.AnyTool.ToolEvent.Intermediate→ToolEvent.Progress;
isIntermediate→isProgress.
Breaking: Loop helper trim
Loop.loopFrom(...)→Loop.loopOver(...).Loop.Event<A, S>→Loop.Step<A, S>.return stop→return stop().Loop.stopWith(state)→Loop.stop(state).nextAfter/stopAfter/stopWithAfter/stopEvent/
nextAfterFoldare removed — compose withStream.concatinstead.
See the migration doc for one-line replacements.
Additive: new Toolkit / Loop helpers
Toolkit.appendToolResults(state, turn)— shorthand for the canonical
continueWithResultsbody that folds tool results into history.Toolkit.collectResults— lower-level drain of aStream<ToolEvent>
to itsToolResults without advancing the loop.Loop.emitValues(stream)/Loop.emitNext(effect)— fork-helper
building blocks behindToolkit.continueWithResults.
Additive: sandboxes
A new
Sandboxcapability in@effect-uai/core/sandboxfor running
untrusted code, commands, or LLM-generated scripts inside an isolated
microVM. Two new provider packages ship behind the same
SandboxService:@effect-uai/microsandbox— local Firecracker microVMs via
microsandbox.@effect-uai/deno— hosted Firecracker microVMs on
Deno Deploy.
Both cover
create/exec/execStream/ volumes / snapshots /
network policies / bound secrets / OCI image references. The
recipes-extras/sandbox-code-interpreterrecipe shows the "run, fix,
repeat" pattern.Additive: new recipes
sleeper-agent— long-lived background agent waking on scheduled
triggers.external-task-polling— drive the loop from an external task
queue.sandbox-code-interpreter(inrecipes-extras/) — agent writes
Python, sandbox runs it, stderr feeds back into the next turn.
-
a332f0a: - Wire
ElevenLabsSynthesizerto the new core dialogue + pronunciation
surface:synthesizeDialogue→POST /v1/text-to-dialogue(raw audio bytes).streamSynthesizeDialogue→POST /v1/text-to-dialogue/stream
(chunked binary).- Layer now also registers the
MultiSpeakerTtscapability marker
(alongsideTtsIncrementalText). Per-turnstyleDescriptionand
speedare silently ignored — ElevenLabsinputs[]takes
{voice_id, text}only. pronunciationsare applied as inline SSML<phoneme alphabet="ipa|cmu-arpabet" ph="...">phrase</phoneme>
tags for the phoneme-gated legacy models (eleven_flash_v2,
eleven_english_v1,eleven_monolingual_v1). Other models silently
drop the overrides.x-sampaentries are always dropped.- Add optional
regionfield to everyConfig(ElevenLabsSynthesizer,
ElevenLabsTranscriber,realtimeTts,realtimeStt). Typed union
ElevenLabsRegion = "default" | "eu" | "in" | (string & {}); resolves to
api.{eu,in}.residency.elevenlabs.io(REST + WSS). Reminder: ElevenLabs
API keys are workspace-bound — pair an EU-workspace key withregion: "eu".baseUrlcontinues to win when set; unknown region strings pass
through as residency host prefixes for forward compat. Exports a
resolveHost(cfg)helper. Non-breaking.
@effect-uai/google
Minor Changes
-
a332f0a: 0.6 bundles one large-but-mechanical naming sweep with a set of
additive features. The breaking part is source-level only — the wire
format is unchanged (function_call/function_call_outputstill
go out on the wire, so no provider payloads change). Almost every
rewrite is find-and-replace; the full before/after diffs and the
recommended order live in Migrating to 0.6.Breaking: "function call" → "tool call" terminology
Every public name that said "function call" now says "tool call":
Item→HistoryItem;FunctionCall→ToolCall;
FunctionCallOutput→ToolCallOutput.Items.functionCallOutput→Items.toolCallOutput;
Items.isFunctionCall→Items.isToolCall;
Items.isFunctionCallOutput→Items.isToolCallOutput.Turn.functionCalls→Turn.getToolCalls.
Breaking: module renames
@effect-uai/core/Outcome→@effect-uai/core/ToolResult. Also
ToolResult.Value→ToolResult.Ok,isValue→isOk,
rejected(...)→failed(...),toFunctionCallOutput→
toToolCallOutput.@effect-uai/core/Resolvers→@effect-uai/core/Approval. Also
fromApprovalMap→fromMap,fromVerdictQueue→fromQueue,
ToolCallDecision→ApprovalDecision, and the queue helper's
announcefield →approvalRequests.
Breaking: Turn / Toolkit / Tool / ToolEvent renames
Turn.appendTurn→Turn.appendToHistory.Turn.toStructured→Turn.decodeStructured.Toolkit.executeAll→Toolkit.run.Toolkit.continueWith→Toolkit.continueWithResults.Toolkit.make(...)+Toolkit.toDescriptors(kit)→ just
Tool.toDescriptors([...]). The homogeneous-toolkit wrapper is gone.Tool.AnyKindTool→Tool.AnyTool.ToolEvent.Intermediate→ToolEvent.Progress;
isIntermediate→isProgress.
Breaking: Loop helper trim
Loop.loopFrom(...)→Loop.loopOver(...).Loop.Event<A, S>→Loop.Step<A, S>.return stop→return stop().Loop.stopWith(state)→Loop.stop(state).nextAfter/stopAfter/stopWithAfter/stopEvent/
nextAfterFoldare removed — compose withStream.concatinstead.
See the migration doc for one-line replacements.
Additive: new Toolkit / Loop helpers
Toolkit.appendToolResults(state, turn)— shorthand for the canonical
continueWithResultsbody that folds tool results into history.Toolkit.collectResults— lower-level drain of aStream<ToolEvent>
to itsToolResults without advancing the loop.Loop.emitValues(stream)/Loop.emitNext(effect)— fork-helper
building blocks behindToolkit.continueWithResults.
Additive: sandboxes
A new
Sandboxcapability in@effect-uai/core/sandboxfor running
untrusted code, commands, or LLM-generated scripts inside an isolated
microVM. Two new provider packages ship behind the same
SandboxService:@effect-uai/microsandbox— local Firecracker microVMs via
microsandbox.@effect-uai/deno— hosted Firecracker microVMs on
Deno Deploy.
Both cover
create/exec/execStream/ volumes / snapshots /
network policies / bound secrets / OCI image references. The
recipes-extras/sandbox-code-interpreterrecipe shows the "run, fix,
repeat" pattern.Additive: new recipes
sleeper-agent— long-lived background agent waking on scheduled
triggers.external-task-polling— drive the loop from an external task
queue.sandbox-code-interpreter(inrecipes-extras/) — agent writes
Python, sandbox runs it, stderr feeds back into the next turn.
-
a332f0a: -
GeminiSynthesizerimplements the newSpeechSynthesizerService
dialogue methods (synthesizeDialogue,streamSynthesizeDialogue) —
both fail withAiError.Unsupported. The Layer does NOT ship the
MultiSpeakerTtsmarker, so callers using the top-level
synthesizeDialoguehelper get a compile-time error against this
Layer alone. For Gemini-voice multi-speaker, use the upcoming
@effect-uai/google-speechpackage with Cloud TTS.pronunciationsonCommonSynthesizeRequestis silently ignored
(Gemini API has no equivalent field).
@effect-uai/inworld
Minor Changes
-
a332f0a: 0.6 bundles one large-but-mechanical naming sweep with a set of
additive features. The breaking part is source-level only — the wire
format is unchanged (function_call/function_call_outputstill
go out on the wire, so no provider payloads change). Almost every
rewrite is find-and-replace; the full before/after diffs and the
recommended order live in Migrating to 0.6.Breaking: "function call" → "tool call" terminology
Every public name that said "function call" now says "tool call":
Item→HistoryItem;FunctionCall→ToolCall;
FunctionCallOutput→ToolCallOutput.Items.functionCallOutput→Items.toolCallOutput;
Items.isFunctionCall→Items.isToolCall;
Items.isFunctionCallOutput→Items.isToolCallOutput.Turn.functionCalls→Turn.getToolCalls.
Breaking: module renames
@effect-uai/core/Outcome→@effect-uai/core/ToolResult. Also
ToolResult.Value→ToolResult.Ok,isValue→isOk,
rejected(...)→failed(...),toFunctionCallOutput→
toToolCallOutput.@effect-uai/core/Resolvers→@effect-uai/core/Approval. Also
fromApprovalMap→fromMap,fromVerdictQueue→fromQueue,
ToolCallDecision→ApprovalDecision, and the queue helper's
announcefield →approvalRequests.
Breaking: Turn / Toolkit / Tool / ToolEvent renames
Turn.appendTurn→Turn.appendToHistory.Turn.toStructured→Turn.decodeStructured.Toolkit.executeAll→Toolkit.run.Toolkit.continueWith→Toolkit.continueWithResults.Toolkit.make(...)+Toolkit.toDescriptors(kit)→ just
Tool.toDescriptors([...]). The homogeneous-toolkit wrapper is gone.Tool.AnyKindTool→Tool.AnyTool.ToolEvent.Intermediate→ToolEvent.Progress;
isIntermediate→isProgress.
Breaking: Loop helper trim
Loop.loopFrom(...)→Loop.loopOver(...).Loop.Event<A, S>→Loop.Step<A, S>.return stop→return stop().Loop.stopWith(state)→Loop.stop(state).nextAfter/stopAfter/stopWithAfter/stopEvent/
nextAfterFoldare removed — compose withStream.concatinstead.
See the migration doc for one-line replacements.
Additive: new Toolkit / Loop helpers
Toolkit.appendToolResults(state, turn)— shorthand for the canonical
continueWithResultsbody that folds tool results into history.Toolkit.collectResults— lower-level drain of aStream<ToolEvent>
to itsToolResults without advancing the loop.Loop.emitValues(stream)/Loop.emitNext(effect)— fork-helper
building blocks behindToolkit.continueWithResults.
Additive: sandboxes
A new
Sandboxcapability in@effect-uai/core/sandboxfor running
untrusted code, commands, or LLM-generated scripts inside an isolated
microVM. Two new provider packages ship behind the same
SandboxService:@effect-uai/microsandbox— local Firecracker microVMs via
microsandbox.@effect-uai/deno— hosted Firecracker microVMs on
Deno Deploy.
Both cover
create/exec/execStream/ volumes / snapshots /
network policies / bound secrets / OCI image references. The
recipes-extras/sandbox-code-interpreterrecipe shows the "run, fix,
repeat" pattern.Additive: new recipes
sleeper-agent— long-lived background agent waking on scheduled
triggers.external-task-polling— drive the loop from an external task
queue.sandbox-code-interpreter(inrecipes-extras/) — agent writes
Python, sandbox runs it, stderr feeds back into the next turn.
-
a332f0a: -
InworldSynthesizerimplements the newSpeechSynthesizerService
dialogue methods (synthesizeDialogue,streamSynthesizeDialogue) —
both fail withAiError.Unsupported. The Layer does NOT ship the
MultiSpeakerTtsmarker; multi-speaker calls fail at compile time.pronunciationsonCommonSynthesizeRequestare applied as inline
/ipa/tokens intext(Inworld's documented mechanism). Onlyipa
entries are honored;x-sampaandcmu-arpabetentries are silently
dropped. English-only.
@effect-uai/jina
Minor Changes
-
a332f0a: 0.6 bundles one large-but-mechanical naming sweep with a set of
additive features. The breaking part is source-level only — the wire
format is unchanged (function_call/function_call_outputstill
go out on the wire, so no provider payloads change). Almost every
rewrite is find-and-replace; the full before/after diffs and the
recommended order live in Migrating to 0.6.Breaking: "function call" → "tool call" terminology
Every public name that said "function call" now says "tool call":
Item→HistoryItem;FunctionCall→ToolCall;
FunctionCallOutput→ToolCallOutput.Items.functionCallOutput→Items.toolCallOutput;
Items.isFunctionCall→Items.isToolCall;
Items.isFunctionCallOutput→Items.isToolCallOutput.Turn.functionCalls→Turn.getToolCalls.
Breaking: module renames
@effect-uai/core/Outcome→@effect-uai/core/ToolResult. Also
ToolResult.Value→ToolResult.Ok,isValue→isOk,
rejected(...)→failed(...),toFunctionCallOutput→
toToolCallOutput.@effect-uai/core/Resolvers→@effect-uai/core/Approval. Also
fromApprovalMap→fromMap,fromVerdictQueue→fromQueue,
ToolCallDecision→ApprovalDecision, and the queue helper's
announcefield →approvalRequests.
Breaking: Turn / Toolkit / Tool / ToolEvent renames
Turn.appendTurn→Turn.appendToHistory.Turn.toStructured→Turn.decodeStructured.Toolkit.executeAll→Toolkit.run.Toolkit.continueWith→Toolkit.continueWithResults.Toolkit.make(...)+Toolkit.toDescriptors(kit)→ just
Tool.toDescriptors([...]). The homogeneous-toolkit wrapper is gone.Tool.AnyKindTool→Tool.AnyTool.ToolEvent.Intermediate→ToolEvent.Progress;
isIntermediate→isProgress.
Breaking: Loop helper trim
Loop.loopFrom(...)→Loop.loopOver(...).Loop.Event<A, S>→Loop.Step<A, S>.return stop→return stop().Loop.stopWith(state)→Loop.stop(state).nextAfter/stopAfter/stopWithAfter/stopEvent/
nextAfterFoldare removed — compose withStream.concatinstead.
See the migration doc for one-line replacements.
Additive: new Toolkit / Loop helpers
Toolkit.appendToolResults(state, turn)— shorthand for the canonical
continueWithResultsbody that folds tool results into history.Toolkit.collectResults— lower-level drain of aStream<ToolEvent>
to itsToolResults without advancing the loop.Loop.emitValues(stream)/Loop.emitNext(effect)— fork-helper
building blocks behindToolkit.continueWithResults.
Additive: sandboxes
A new
Sandboxcapability in@effect-uai/core/sandboxfor running
untrusted code, commands, or LLM-generated scripts inside an isolated
microVM. Two new provider packages ship behind the same
SandboxService:@effect-uai/microsandbox— local Firecracker microVMs via
microsandbox.@effect-uai/deno— hosted Firecracker microVMs on
Deno Deploy.
Both cover
create/exec/execStream/ volumes / snapshots /
network policies / bound secrets / OCI image references. The
recipes-extras/sandbox-code-interpreterrecipe shows the "run, fix,
repeat" pattern.Additive: new recipes
sleeper-agent— long-lived background agent waking on scheduled
triggers.external-task-polling— drive the loop from an external task
queue.sandbox-code-interpreter(inrecipes-extras/) — agent writes
Python, sandbox runs it, stderr feeds back into the next turn.
@effect-uai/microsandbox
Minor Changes
-
a332f0a: 0.6 bundles one large-but-mechanical naming sweep with a set of
additive features. The breaking part is source-level only — the wire
format is unchanged (function_call/function_call_outputstill
go out on the wire, so no provider payloads change). Almost every
rewrite is find-and-replace; the full before/after diffs and the
recommended order live in Migrating to 0.6.Breaking: "function call" → "tool call" terminology
Every public name that said "function call" now says "tool call":
Item→HistoryItem;FunctionCall→ToolCall;
FunctionCallOutput→ToolCallOutput.Items.functionCallOutput→Items.toolCallOutput;
Items.isFunctionCall→Items.isToolCall;
Items.isFunctionCallOutput→Items.isToolCallOutput.Turn.functionCalls→Turn.getToolCalls.
Breaking: module renames
@effect-uai/core/Outcome→@effect-uai/core/ToolResult. Also
ToolResult.Value→ToolResult.Ok,isValue→isOk,
rejected(...)→failed(...),toFunctionCallOutput→
toToolCallOutput.@effect-uai/core/Resolvers→@effect-uai/core/Approval. Also
fromApprovalMap→fromMap,fromVerdictQueue→fromQueue,
ToolCallDecision→ApprovalDecision, and the queue helper's
announcefield →approvalRequests.
Breaking: Turn / Toolkit / Tool / ToolEvent renames
Turn.appendTurn→Turn.appendToHistory.Turn.toStructured→Turn.decodeStructured.Toolkit.executeAll→Toolkit.run.Toolkit.continueWith→Toolkit.continueWithResults.Toolkit.make(...)+Toolkit.toDescriptors(kit)→ just
Tool.toDescriptors([...]). The homogeneous-toolkit wrapper is gone.Tool.AnyKindTool→Tool.AnyTool.ToolEvent.Intermediate→ToolEvent.Progress;
isIntermediate→isProgress.
Breaking: Loop helper trim
Loop.loopFrom(...)→Loop.loopOver(...).Loop.Event<A, S>→Loop.Step<A, S>.return stop→return stop().Loop.stopWith(state)→Loop.stop(state).nextAfter/stopAfter/stopWithAfter/stopEvent/
nextAfterFoldare removed — compose withStream.concatinstead.
See the migration doc for one-line replacements.
Additive: new Toolkit / Loop helpers
Toolkit.appendToolResults(state, turn)— shorthand for the canonical
continueWithResultsbody that folds tool results into history.Toolkit.collectResults— lower-level drain of aStream<ToolEvent>
to itsToolResults without advancing the loop.Loop.emitValues(stream)/Loop.emitNext(effect)— fork-helper
building blocks behindToolkit.continueWithResults.
Additive: sandboxes
A new
Sandboxcapability in@effect-uai/core/sandboxfor running
untrusted code, commands, or LLM-generated scripts inside an isolated
microVM. Two new provider packages ship behind the same
SandboxService:@effect-uai/microsandbox— local Firecracker microVMs via
microsandbox.@effect-uai/deno— hosted Firecracker microVMs on
Deno Deploy.
Both cover
create/exec/execStream/ volumes / snapshots /
network policies / bound secrets / OCI image references. The
recipes-extras/sandbox-code-interpreterrecipe shows the "run, fix,
repeat" pattern.Additive: new recipes
sleeper-agent— long-lived background agent waking on scheduled
triggers.external-task-polling— drive the loop from an external task
queue.sandbox-code-interpreter(inrecipes-extras/) — agent writes
Python, sandbox runs it, stderr feeds back into the next turn.
@effect-uai/openai
Minor Changes
-
a332f0a: 0.6 bundles one large-but-mechanical naming sweep with a set of
additive features. The breaking part is source-level only — the wire
format is unchanged (function_call/function_call_outputstill
go out on the wire, so no provider payloads change). Almost every
rewrite is find-and-replace; the full before/after diffs and the
recommended order live in Migrating to 0.6.Breaking: "function call" → "tool call" terminology
Every public name that said "function call" now says "tool call":
Item→HistoryItem;FunctionCall→ToolCall;
FunctionCallOutput→ToolCallOutput.Items.functionCallOutput→Items.toolCallOutput;
Items.isFunctionCall→Items.isToolCall;
Items.isFunctionCallOutput→Items.isToolCallOutput.Turn.functionCalls→Turn.getToolCalls.
Breaking: module renames
@effect-uai/core/Outcome→@effect-uai/core/ToolResult. Also
ToolResult.Value→ToolResult.Ok,isValue→isOk,
rejected(...)→failed(...),toFunctionCallOutput→
toToolCallOutput.@effect-uai/core/Resolvers→@effect-uai/core/Approval. Also
fromApprovalMap→fromMap,fromVerdictQueue→fromQueue,
ToolCallDecision→ApprovalDecision, and the queue helper's
announcefield →approvalRequests.
Breaking: Turn / Toolkit / Tool / ToolEvent renames
Turn.appendTurn→Turn.appendToHistory.Turn.toStructured→Turn.decodeStructured.Toolkit.executeAll→Toolkit.run.Toolkit.continueWith→Toolkit.continueWithResults.Toolkit.make(...)+Toolkit.toDescriptors(kit)→ just
Tool.toDescriptors([...]). The homogeneous-toolkit wrapper is gone.Tool.AnyKindTool→Tool.AnyTool.ToolEvent.Intermediate→ToolEvent.Progress;
isIntermediate→isProgress.
Breaking: Loop helper trim
Loop.loopFrom(...)→Loop.loopOver(...).Loop.Event<A, S>→Loop.Step<A, S>.return stop→return stop().Loop.stopWith(state)→Loop.stop(state).nextAfter/stopAfter/stopWithAfter/stopEvent/
nextAfterFoldare removed — compose withStream.concatinstead.
See the migration doc for one-line replacements.
Additive: new Toolkit / Loop helpers
Toolkit.appendToolResults(state, turn)— shorthand for the canonical
continueWithResultsbody that folds tool results into history.Toolkit.collectResults— lower-level drain of aStream<ToolEvent>
to itsToolResults without advancing the loop.Loop.emitValues(stream)/Loop.emitNext(effect)— fork-helper
building blocks behindToolkit.continueWithResults.
Additive: sandboxes
A new
Sandboxcapability in@effect-uai/core/sandboxfor running
untrusted code, commands, or LLM-generated scripts inside an isolated
microVM. Two new provider packages ship behind the same
SandboxService:@effect-uai/microsandbox— local Firecracker microVMs via
microsandbox.@effect-uai/deno— hosted Firecracker microVMs on
Deno Deploy.
Both cover
create/exec/execStream/ volumes / snapshots /
network policies / bound secrets / OCI image references. The
recipes-extras/sandbox-code-interpreterrecipe shows the "run, fix,
repeat" pattern.Additive: new recipes
sleeper-agent— long-lived background agent waking on scheduled
triggers.external-task-polling— drive the loop from an external task
queue.sandbox-code-interpreter(inrecipes-extras/) — agent writes
Python, sandbox runs it, stderr feeds back into the next turn.
-
a332f0a: -
OpenAISynthesizerimplements the newSpeechSynthesizerService
dialogue methods (synthesizeDialogue,streamSynthesizeDialogue) —
both fail withAiError.Unsupported. The Layer does NOT ship the
MultiSpeakerTtsmarker; multi-speaker calls fail at compile time.pronunciationsonCommonSynthesizeRequestis silently ignored —
OpenAI TTS has no phoneme override surface.- Add optional
regionfield to everyConfig(OpenAISynthesizer,
OpenAITranscriber,realtimeStt). Typed unionOpenAiRegion = "default" | "eu" | (string & {}); resolves toeu.api.openai.comfor EU-residency
projects.baseUrlcontinues to win when set; unknown region strings pass
through as host prefixes ({region}.api.openai.com/v1) for forward compat.
Each package exports aresolveHost(cfg)helper. Non-breaking.
@effect-uai/responses
Minor Changes
-
a332f0a: 0.6 bundles one large-but-mechanical naming sweep with a set of
additive features. The breaking part is source-level only — the wire
format is unchanged (function_call/function_call_outputstill
go out on the wire, so no provider payloads change). Almost every
rewrite is find-and-replace; the full before/after diffs and the
recommended order live in Migrating to 0.6.Breaking: "function call" → "tool call" terminology
Every public name that said "function call" now says "tool call":
Item→HistoryItem;FunctionCall→ToolCall;
FunctionCallOutput→ToolCallOutput.Items.functionCallOutput→Items.toolCallOutput;
Items.isFunctionCall→Items.isToolCall;
Items.isFunctionCallOutput→Items.isToolCallOutput.Turn.functionCalls→Turn.getToolCalls.
Breaking: module renames
@effect-uai/core/Outcome→@effect-uai/core/ToolResult. Also
ToolResult.Value→ToolResult.Ok,isValue→isOk,
rejected(...)→failed(...),toFunctionCallOutput→
toToolCallOutput.@effect-uai/core/Resolvers→@effect-uai/core/Approval. Also
fromApprovalMap→fromMap,fromVerdictQueue→fromQueue,
ToolCallDecision→ApprovalDecision, and the queue helper's
announcefield →approvalRequests.
Breaking: Turn / Toolkit / Tool / ToolEvent renames
Turn.appendTurn→Turn.appendToHistory.Turn.toStructured→Turn.decodeStructured.Toolkit.executeAll→Toolkit.run.Toolkit.continueWith→Toolkit.continueWithResults.Toolkit.make(...)+Toolkit.toDescriptors(kit)→ just
Tool.toDescriptors([...]). The homogeneous-toolkit wrapper is gone.Tool.AnyKindTool→Tool.AnyTool.ToolEvent.Intermediate→ToolEvent.Progress;
isIntermediate→isProgress.
Breaking: Loop helper trim
Loop.loopFrom(...)→Loop.loopOver(...).Loop.Event<A, S>→Loop.Step<A, S>.return stop→return stop().Loop.stopWith(state)→Loop.stop(state).nextAfter/stopAfter/stopWithAfter/stopEvent/
nextAfterFoldare removed — compose withStream.concatinstead.
See the migration doc for one-line replacements.
Additive: new Toolkit / Loop helpers
Toolkit.appendToolResults(state, turn)— shorthand for the canonical
continueWithResultsbody that folds tool results into history.Toolkit.collectResults— lower-level drain of aStream<ToolEvent>
to itsToolResults without advancing the loop.Loop.emitValues(stream)/Loop.emitNext(effect)— fork-helper
building blocks behindToolkit.continueWithResults.
Additive: sandboxes
A new
Sandboxcapability in@effect-uai/core/sandboxfor running
untrusted code, commands, or LLM-generated scripts inside an isolated
microVM. Two new provider packages ship behind the same
SandboxService:@effect-uai/microsandbox— local Firecracker microVMs via
microsandbox.@effect-uai/deno— hosted Firecracker microVMs on
Deno Deploy.
Both cover
create/exec/execStream/ volumes / snapshots /
network policies / bound secrets / OCI image references. The
recipes-extras/sandbox-code-interpreterrecipe shows the "run, fix,
repeat" pattern.Additive: new recipes
sleeper-agent— long-lived background agent waking on scheduled
triggers.external-task-polling— drive the loop from an external task
queue.sandbox-code-interpreter(inrecipes-extras/) — agent writes
Python, sandbox runs it, stderr feeds back into the next turn.
-
a332f0a: - Add optional
regionfield to bothConfigs (Responses,
OpenAIEmbedding). Typed unionOpenAiRegion = "default" | "eu" | (string & {}); resolves toeu.api.openai.comfor EU-residency projects.baseUrl
continues to win when set; unknown region strings pass through as host
prefixes ({region}.api.openai.com/v1) for forward compat. Exports a
resolveHost(cfg)helper. Non-breaking.