Releases: VoltAgent/voltagent
@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
create-voltagent-app@0.2.19
Patch Changes
-
3e00061Thanks @omeraplak! - feat(create-voltagent-app): add package manager selection with Bun support (#1129)The CLI now detects available package managers (
pnpm,bun,yarn,npm) and lets users
choose which one to use during project setup.The selected package manager is used for dependency installation and post-create run instructions.
If no package manager is detected, the CLI now falls back tonpmwith a clear warning.
@voltagent/core@2.6.4
Patch Changes
-
#1131
9a3ff6bThanks @omeraplak! - fix(core): persist reasoning and tool parts across step checkpoint flushes (#1130)When
conversationPersistence.mode = "step"was used with tool calls, some checkpoint flows could
persist incomplete assistant messages and lose non-text parts in stored conversation history.This update preserves complete assistant message parts during checkpoint merges and persistence
flushes, including reasoning, tool-call, tool-result, and text parts.Regression coverage is expanded with end-to-end agent persistence tests against both LibSQL and
PostgreSQL backends to reduce the chance of similar regressions. -
#1123
13f4f40Thanks @omeraplak! - fix: prevent duplicate assistant message persistence during step checkpoints (#1121)When
conversationPersistence.mode = "step"flushed around tool results, the same assistant
response could be persisted multiple times with differentmessage_idvalues. This created
duplicate assistant rows in memory and could surface downstream provider errors like duplicate
OpenAI reasoning item ids.This update keeps a stable assistant response message id across step checkpoints and skips duplicate
step response payloads before buffering, so intermediate checkpoint flushes update the same memory
message instead of inserting new duplicates.
@voltagent/core@2.6.3
Patch Changes
-
#1123
527f2cfThanks @omeraplak! - fix: prevent duplicate assistant message persistence during step checkpoints (#1121)When
conversationPersistence.mode = "step"flushed around tool results, the same assistant
response could be persisted multiple times with differentmessage_idvalues. This created
duplicate assistant rows in memory and could surface downstream provider errors like duplicate
OpenAI reasoning item ids.This update keeps a stable assistant response message id across step checkpoints and skips duplicate
step response payloads before buffering, so intermediate checkpoint flushes update the same memory
message instead of inserting new duplicates. -
#1122
e03e1ecThanks @omeraplak! - Avoid reinitializing serverless observability remote exporters when the resolved VoltOps endpoint and headers are unchanged. This prevents unnecessary provider shutdown/recreation cycles that can surface as noisy "Processor shutdown" traces in long-lived serverless instances.Adds a unit test to ensure repeated environment sync calls do not trigger duplicate
updateServerlessRemoteinvocations when config is stable.
@voltagent/langfuse-exporter@2.0.3
@voltagent/core@2.6.2
Patch Changes
- #1117
8cb05dcThanks @omeraplak! - fix: preserve user-definedsearchToolsandcallToolwhen tool routing is enabled- User-defined tools named
searchToolsorcallToolnow take precedence over internal tool-routing support tools. - These tools are no longer silently filtered from routing pool/state just because of their names.
toolRouting: falseno longer fails for user-defined tools that reuse those names.
- User-defined tools named
@voltagent/evals@2.0.4
Patch Changes
-
#1108
c1df46fThanks @omeraplak! - fix: persist offline eval runs when using inline datasets (dataset.items)Offline experiment runs now create and sync run results even when the dataset is provided inline without a managed
datasetVersionId.What changed
VoltOpsRunManagernow allows run creation whendataset.versionIdis missing.- Append payload generation now normalizes
datasetItemId:- UUID item IDs are sent as
datasetItemId. - Non-UUID item IDs are sent as
nulland still tracked viadatasetItemHash.
- UUID item IDs are sent as
This avoids API failures when inline dataset items use string IDs like
"item-1".Example
import { createExperiment, runExperiment } from "@voltagent/evals"; const experiment = createExperiment({ dataset: { name: "inline-smoke", items: [ { id: "item-1", // non-UUID is supported input: "What is VoltAgent?", expected: "An open-source TypeScript framework for AI agents.", }, ], }, runner: async ({ item }) => ({ output: String(item.input) }), }); const result = await runExperiment(experiment, { voltOpsClient }); console.log(result.runId); // now created and persisted