Releases: VoltAgent/voltagent
@voltagent/core@2.6.10
Patch Changes
-
#1155
52bda94Thanks @omeraplak! - fix: capture provider-reported OpenRouter costs in observability spansWhat's Changed
- Forward OpenRouter provider-reported cost metadata to both LLM spans and root agent spans.
- Record
usage.costandusage.cost_details.upstream_inference_*attributes for downstream cost consumers. - Document OpenRouter usage accounting and custom
onEndhook-based cost reporting in the observability docs.
@voltagent/ag-ui@1.0.6
Patch Changes
-
#1149
19c4fcfThanks @corners99! - fix: useinputinstead ofargsfor tool-call parts in message conversionWhen converting CopilotKit assistant messages with tool calls to VoltAgent format,
the adapter was settingargson tool-call parts. The AI SDK'sToolCallPart
interface expectsinput, causing the Anthropic provider to sendundefinedas
the tool_use input — rejected by the API with:"messages.N.content.N.tool_use.input: Input should be a valid dictionary"
@voltagent/core@2.6.8
Patch Changes
- #1146
c7b4c45Thanks @omeraplak! - Improve structured-output error handling forAgent.generateTextwhen models do not emit a final output (for example after tool-calling steps).- Detect missing
result.outputimmediately whenoutputis requested and throw a descriptiveVoltAgentError(STRUCTURED_OUTPUT_NOT_GENERATED) instead of surfacing a vagueAI_NoOutputGeneratedErrorlater. - Include finish reason and step/tool metadata in the error for easier debugging.
- Add an unhandled-rejection hint in
VoltAgentlogs for missing structured outputs.
- Detect missing
@voltagent/server-core@2.1.9
Patch Changes
-
99680b1Thanks @omeraplak! - feat: add runtime memory envelope (options.memory) and deprecate legacy top-level memory fieldsWhat's New
- Added a preferred per-call memory envelope:
options.memory.conversationIdfor conversation-scoped memoryoptions.memory.userIdfor user-scoped memoryoptions.memory.optionsfor memory behavior overrides (contextLimit,semanticMemory,conversationPersistence)
- Kept legacy top-level fields for backward compatibility:
options.conversationId,options.userId,options.contextLimit,options.semanticMemory,options.conversationPersistence
- Legacy fields are now marked deprecated in type/docs, and envelope values are preferred when both are provided.
Usage Examples
Legacy (still supported, deprecated):
await agent.generateText("Hello", { userId: "user-123", conversationId: "conv-123", contextLimit: 20, semanticMemory: { enabled: true, semanticLimit: 5, }, conversationPersistence: { mode: "step", debounceMs: 150, }, });
Preferred (new
memoryenvelope):await agent.generateText("Hello", { memory: { userId: "user-123", conversationId: "conv-123", options: { contextLimit: 20, semanticMemory: { enabled: true, semanticLimit: 5, }, conversationPersistence: { mode: "step", debounceMs: 150, }, }, }, });
Server and Resumable Stream Alignment
@voltagent/server-corenow accepts/documents theoptions.memoryenvelope in request schemas.- Resumable stream identity resolution now reads
conversationId/userIdfromoptions.memoryfirst and falls back to legacy fields. - Added tests for:
- parsing
options.memoryin server schemas - resolving resumable stream keys from
options.memory
- parsing
- Added a preferred per-call memory envelope:
-
Updated dependencies [
99680b1]:- @voltagent/core@2.6.6
@voltagent/server-core@2.1.10
Patch Changes
-
#1141
faa5023Thanks @omeraplak! - feat: add per-call memory read-only mode viamemory.options.readOnly.When
readOnlyis enabled, the agent still reads conversation context and working memory, but skips memory writes for the current call.What changes in read-only mode:
- Conversation message persistence is disabled.
- Step persistence/checkpoint writes are disabled.
- Background input persistence for context hydration is disabled.
- Working memory write tools are disabled (
update_working_memory,clear_working_memory). - Read-only tool remains available (
get_working_memory).
@voltagent/server-corenow acceptsmemory.options.readOnlyin request schema/options parsing.Before
await agent.generateText("Summarize this", { memory: { userId: "user-123", conversationId: "conv-456", }, }); // reads + writes memory
After
await agent.generateText("Summarize this", { memory: { userId: "user-123", conversationId: "conv-456", options: { readOnly: true, }, }, }); // reads memory only, no writes
-
Updated dependencies [
faa5023,0f7ee7c]:- @voltagent/core@2.6.7
@voltagent/resumable-streams@2.0.2
Patch Changes
-
99680b1Thanks @omeraplak! - feat: add runtime memory envelope (options.memory) and deprecate legacy top-level memory fieldsWhat's New
- Added a preferred per-call memory envelope:
options.memory.conversationIdfor conversation-scoped memoryoptions.memory.userIdfor user-scoped memoryoptions.memory.optionsfor memory behavior overrides (contextLimit,semanticMemory,conversationPersistence)
- Kept legacy top-level fields for backward compatibility:
options.conversationId,options.userId,options.contextLimit,options.semanticMemory,options.conversationPersistence
- Legacy fields are now marked deprecated in type/docs, and envelope values are preferred when both are provided.
Usage Examples
Legacy (still supported, deprecated):
await agent.generateText("Hello", { userId: "user-123", conversationId: "conv-123", contextLimit: 20, semanticMemory: { enabled: true, semanticLimit: 5, }, conversationPersistence: { mode: "step", debounceMs: 150, }, });
Preferred (new
memoryenvelope):await agent.generateText("Hello", { memory: { userId: "user-123", conversationId: "conv-123", options: { contextLimit: 20, semanticMemory: { enabled: true, semanticLimit: 5, }, conversationPersistence: { mode: "step", debounceMs: 150, }, }, }, });
Server and Resumable Stream Alignment
@voltagent/server-corenow accepts/documents theoptions.memoryenvelope in request schemas.- Resumable stream identity resolution now reads
conversationId/userIdfromoptions.memoryfirst and falls back to legacy fields. - Added tests for:
- parsing
options.memoryin server schemas - resolving resumable stream keys from
options.memory
- parsing
- Added a preferred per-call memory envelope:
-
Updated dependencies [
99680b1]:- @voltagent/core@2.6.6
@voltagent/core@2.6.7
Patch Changes
-
#1141
faa5023Thanks @omeraplak! - feat: add per-call memory read-only mode viamemory.options.readOnly.When
readOnlyis enabled, the agent still reads conversation context and working memory, but skips memory writes for the current call.What changes in read-only mode:
- Conversation message persistence is disabled.
- Step persistence/checkpoint writes are disabled.
- Background input persistence for context hydration is disabled.
- Working memory write tools are disabled (
update_working_memory,clear_working_memory). - Read-only tool remains available (
get_working_memory).
@voltagent/server-corenow acceptsmemory.options.readOnlyin request schema/options parsing.Before
await agent.generateText("Summarize this", { memory: { userId: "user-123", conversationId: "conv-456", }, }); // reads + writes memory
After
await agent.generateText("Summarize this", { memory: { userId: "user-123", conversationId: "conv-456", options: { readOnly: true, }, }, }); // reads memory only, no writes
-
#1142
0f7ee7cThanks @SergioChan! - fix(core): avoid duplicating stdout/stderr stream content in sandbox summary metadata
@voltagent/core@2.6.6
Patch Changes
-
99680b1Thanks @omeraplak! - feat: add runtime memory envelope (options.memory) and deprecate legacy top-level memory fieldsWhat's New
- Added a preferred per-call memory envelope:
options.memory.conversationIdfor conversation-scoped memoryoptions.memory.userIdfor user-scoped memoryoptions.memory.optionsfor memory behavior overrides (contextLimit,semanticMemory,conversationPersistence)
- Kept legacy top-level fields for backward compatibility:
options.conversationId,options.userId,options.contextLimit,options.semanticMemory,options.conversationPersistence
- Legacy fields are now marked deprecated in type/docs, and envelope values are preferred when both are provided.
Usage Examples
Legacy (still supported, deprecated):
await agent.generateText("Hello", { userId: "user-123", conversationId: "conv-123", contextLimit: 20, semanticMemory: { enabled: true, semanticLimit: 5, }, conversationPersistence: { mode: "step", debounceMs: 150, }, });
Preferred (new
memoryenvelope):await agent.generateText("Hello", { memory: { userId: "user-123", conversationId: "conv-123", options: { contextLimit: 20, semanticMemory: { enabled: true, semanticLimit: 5, }, conversationPersistence: { mode: "step", debounceMs: 150, }, }, }, });
Server and Resumable Stream Alignment
@voltagent/server-corenow accepts/documents theoptions.memoryenvelope in request schemas.- Resumable stream identity resolution now reads
conversationId/userIdfromoptions.memoryfirst and falls back to legacy fields. - Added tests for:
- parsing
options.memoryin server schemas - resolving resumable stream keys from
options.memory
- parsing
- Added a preferred per-call memory envelope:
@voltagent/core@2.6.5
Patch Changes
- #1135
a447ca3Thanks @corners99! - fix(core,ag-ui): guard double writer.close() and RUN_FINISHED after RUN_ERROR
@voltagent/ag-ui@1.0.5
Patch Changes
- #1135
a447ca3Thanks @corners99! - fix(core,ag-ui): guard double writer.close() and RUN_FINISHED after RUN_ERROR