Skip to content

trigger.dev v4.5.0-rc.7

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 17 Jun 12:19
· 10 commits to main since this release
015106d

Upgrade

npx trigger.dev@4.5.0-rc.7 update
pnpm dlx trigger.dev@4.5.0-rc.7 update
yarn dlx trigger.dev@4.5.0-rc.7 update 
bunx trigger.dev@4.5.0-rc.7 update

Self-hosted Docker image: ghcr.io/triggerdotdev/trigger.dev:v4.5.0-rc.7

Improvements

  • @trigger.dev/sdk now bundles the Trigger.dev agent skills and a curated snapshot of the docs those skills reference. The skills that trigger skills installs into your coding agent read this content from node_modules, so the guidance your AI assistant follows is pinned to the SDK version installed in your project and stays current across upgrades instead of going stale until the next reinstall. (#3937)

  • Running a CLI command like dev, deploy, preview, or update before initializing a project no longer crashes with a raw Cannot find matching package.json stack trace. The CLI now detects the missing project and points you to npx trigger.dev@latest init instead. (#3929)

  • The agent skills installed by trigger skills are now namespaced with a trigger- prefix (e.g. trigger-authoring-tasks, trigger-getting-started) so they don't collide with unrelated skills in your coding agent's skills directory. Adds a trigger-cost-savings skill for auditing and reducing compute spend (right-sizing machines, maxDuration, batching, debounce), and @trigger.dev/sdk now bundles the full Trigger.dev documentation so your agent can read the complete, version-pinned reference directly from node_modules. (#3970)

  • The run span API response now includes cachedCost and cacheCreationCost on the ai object, alongside the existing inputCost / outputCost / totalCost. inputCost reflects only the non-cached input, so these fields let you reconstruct the full cost breakdown for prompt-cached calls. (#3958)

  • chat.headStart now works with the chat.customAgent and chat.createSession backends, not only chat.agent. The warm step-1 response hands over to your loop the same way it does for a managed agent. (#3963)

    In a chat.customAgent loop, consume the handover on turn 0:

    const conversation = new chat.MessageAccumulator();
    const { isFinal, skipped } = await conversation.consumeHandover({ payload });
    if (skipped) return; // warm handler aborted, so exit without a turn
    if (isFinal) {
      await chat.writeTurnComplete(); // step 1 is the response, no streamText
    } else {
      const result = streamText({ model, messages: conversation.modelMessages, tools });
      // Pass originalMessages so the handed-over tool round merges into the
      // step-1 assistant instead of starting a new message.
      const response = await chat.pipeAndCapture(result, {
        originalMessages: conversation.uiMessages,
      });
      if (response) await conversation.addResponse(response);
    }

    With chat.createSession, the iterator surfaces it as turn.handover; call turn.complete() with no argument on a final handover. The lower-level chat.waitForHandover() and accumulator.applyHandover() are also exported for hand-rolled loops.

  • Cache your chat agent's system prompt with Anthropic prompt caching. chat.toStreamTextOptions() now emits the system prompt as a cacheable message when you opt in, so a large, stable system block is billed at cache-read rates on every turn instead of full price. (#3952)

    // at the streamText call site (Anthropic sugar)
    streamText({
      ...chat.toStreamTextOptions({ cacheControl: { type: "ephemeral" } }),
      messages,
    });
    
    // provider-agnostic equivalent
    chat.toStreamTextOptions({
      systemProviderOptions: { anthropic: { cacheControl: { type: "ephemeral" } } },
    });
    
    // or where the prompt is defined
    chat.prompt.set(SYSTEM_PROMPT, {
      providerOptions: { anthropic: { cacheControl: { type: "ephemeral" } } },
    });

    Without an option, system stays a plain string. Pairs with a prepareMessages cache breakpoint to cache the conversation prefix across turns too.

  • Three fixes for custom agent loops (chat.customAgent, chat.createSession, and hand-rolled MessageAccumulator loops): (#3936)

    • Continuation runs no longer replay already-answered user messages into the first turn. The .in resume cursor is now seeded before any listener attaches (the same boot logic chat.agent uses), so a chat that continues after a cancel, crash, or upgrade only sees genuinely new messages.
    • Steering a hand-rolled loop mid-stream no longer wipes the in-flight assistant response. chat.pipeAndCapture now stamps a server-generated message id on the stream, so a prepareStep injection keeps the partial text instead of replacing the message.
    • Task-backed tools (ai.toolExecute) now work from custom agent loops: the parent's session is threaded to the child run, so child tasks can stream progress into the chat with chat.stream.writer({ target: "root" }) instead of failing with "session handle is not initialized".

All packages: v4.5.0-rc.7

@trigger.dev/build, @trigger.dev/core, @trigger.dev/python, @trigger.dev/react-hooks, @trigger.dev/redis-worker, @trigger.dev/rsc, @trigger.dev/schema-to-json, @trigger.dev/sdk, trigger.dev

Full changelog: v4.4.0.7...v4.5.0-rc.7