Skip to content

Releases: VoltAgent/voltagent

@voltagent/core@2.6.7

06 Mar 18:45
13f5a9e

Choose a tag to compare

Patch Changes

  • #1141 faa5023 Thanks @omeraplak! - feat: add per-call memory read-only mode via memory.options.readOnly.

    When readOnly is 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-core now accepts memory.options.readOnly in 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 0f7ee7c Thanks @SergioChan! - fix(core): avoid duplicating stdout/stderr stream content in sandbox summary metadata

@voltagent/core@2.6.6

06 Mar 05:00
cb0803d

Choose a tag to compare

Patch Changes

  • 99680b1 Thanks @omeraplak! - feat: add runtime memory envelope (options.memory) and deprecate legacy top-level memory fields

    What's New

    • Added a preferred per-call memory envelope:
      • options.memory.conversationId for conversation-scoped memory
      • options.memory.userId for user-scoped memory
      • options.memory.options for 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 memory envelope):

    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-core now accepts/documents the options.memory envelope in request schemas.
    • Resumable stream identity resolution now reads conversationId/userId from options.memory first and falls back to legacy fields.
    • Added tests for:
      • parsing options.memory in server schemas
      • resolving resumable stream keys from options.memory

@voltagent/core@2.6.5

06 Mar 03:32
4ab51b9

Choose a tag to compare

Patch Changes

  • #1135 a447ca3 Thanks @corners99! - fix(core,ag-ui): guard double writer.close() and RUN_FINISHED after RUN_ERROR

@voltagent/ag-ui@1.0.5

06 Mar 03:32
4ab51b9

Choose a tag to compare

Patch Changes

  • #1135 a447ca3 Thanks @corners99! - fix(core,ag-ui): guard double writer.close() and RUN_FINISHED after RUN_ERROR

create-voltagent-app@0.2.19

04 Mar 20:35
2b5287e

Choose a tag to compare

Patch Changes

  • 3e00061 Thanks @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 to npm with a clear warning.

@voltagent/core@2.6.4

04 Mar 20:35
2b5287e

Choose a tag to compare

Patch Changes

  • #1131 9a3ff6b Thanks @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 13f4f40 Thanks @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 different message_id values. 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

03 Mar 20:25
e720235

Choose a tag to compare

Patch Changes

  • #1123 527f2cf Thanks @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 different message_id values. 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 e03e1ec Thanks @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 updateServerlessRemote invocations when config is stable.

@voltagent/langfuse-exporter@2.0.3

28 Feb 03:59
c0f1915

Choose a tag to compare

Patch Changes

  • #1110 8c8aa14 Thanks @pandego! - chore(langfuse-exporter): update langfuse dependency to ^3.38.6 to include upstream fixes for non-JSON error responses during export retries (fixes #670)

@voltagent/core@2.6.2

28 Feb 04:41
7f228b9

Choose a tag to compare

Patch Changes

  • #1117 8cb05dc Thanks @omeraplak! - fix: preserve user-defined searchTools and callTool when tool routing is enabled
    • User-defined tools named searchTools or callTool now 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: false no longer fails for user-defined tools that reuse those names.

@voltagent/evals@2.0.4

25 Feb 02:40
d031576

Choose a tag to compare

Patch Changes

  • #1108 c1df46f Thanks @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

    • VoltOpsRunManager now allows run creation when dataset.versionId is missing.
    • Append payload generation now normalizes datasetItemId:
      • UUID item IDs are sent as datasetItemId.
      • Non-UUID item IDs are sent as null and still tracked via datasetItemHash.

    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