Released 2026-11-13 · Compare with 1.0.0-rc.16
Features
- A dynamic schedule's
runno longer starts its sessions again when the provider retries an occurrence.
Ato().send()without anidempotencyKeynow takes one from the occurrence and the message, so the retry reaches the session the first attempt started. Before, each retry started another session unlessrunpassed its own key. A message that differs between attempts still starts another session; pass anidempotencyKeyto keep it to one. (#6358) - A dynamic schedules definition can declare named
scopes, for one kind of schedule with more than one owner.
scopestakes the place ofscope. The definition still offers one set of management tools, and each tool takes ascopeinput that names the scope to act in. A scope can set its owndescription,preparePayload,run, andapproval, and anidthat keeps the schedules an earlier definition stored.schedules(definition, { scope })binds one scope from code. A definition with a singlescopeis unchanged. (#6360) - A dynamic schedule's
preparePayloadreceives the schedule's timing ascontext.expression.
It is the timing the caller passed, or the stored timing when an update replaces only the payload, sopreparePayloadcan tell a recurring schedule from a one-time one without a payload field for it. (#6359) - Dynamic schedules reject a cron expression that Vercel Schedules can't run before the write is prepared, so a model's call fails before a person is asked to approve it.
Vercel Schedules takes numeric fields only, and not both a day of the month and a day of the week. An expression that breaks these rules, such as one withMONorJAN, now fails with an error that says how to write it.eve devapplies the same rules. A customScheduleProvidercan implement the optionalvalidateExpressionto check timing the same way. (#6357) - Decision spans now name their turn and purpose, and record per-question results as
gen_ai.decision.resultswhen the trace records outputs.
decision <model>spans carryagent.turn.idandagent.decision.purpose(model-selection,tool-approval,agent-routing, orcustom), so Agent Runs can place a model-selection decision in a turn that is still running. Results follow the proposed OpenTelemetry GenAI decision conventions: choices, predicates, scores with their levels, and refusals, each keyed by the question's position. They are output content, recorded only when outputs are and dropped for any destination that declines outputs.AgentRun.decisionaccepts an optionalpurpose, and completing a decision withoutputrecords it as the results. (#6389) - Publish
ghcr.io/vercel/eve-git, eve's default sandbox image plus the GitHub CLI (gh), and the same image to Vercel Container Registry asvcr.vercel.com/vercel/eve/git.
Each eve release pins one tag of it, exported asDEFAULT_EVE_GIT_SANDBOX_IMAGEfromeve/sandbox/dockerandVERCEL_EVE_GIT_SANDBOX_IMAGEfromeve/sandbox/vercel, and both fromeve/extensions/git/sandbox, andlatestmoves to the tag of the released eve package.
Pass the constant asimagesoinstallCodeToolingfromeve/extensions/code/sandboxfindsghand skips itsapt-getinstall, which takes about 7 seconds of a first build. A Vercel Sandbox session from a prepared snapshot of the eve-git image runs no base setup command, like the default image. The default image is unchanged. (#6246)
Bug Fixes
- Update eve's bundled dependencies, including the AI SDK, Vercel SDKs, Chat SDK, and MCP, to their latest releases, and OpenTelemetry to its latest 2.x releases.
eve now requiresai7.0.172 or later.
YAML frontmatter, eval data files, and OpenAPI specs now parse with js-yaml 5 and YAML 1.2 values. An unquoted date such as2024-01-02loads as a string instead of aDate, and a0bbinary literal such as0b101loads as a string instead of a number. The YAML 1.1 tags!!timestamp,!!binary,!!set,!!omap, and!!pairsare no longer recognized, and a mapping with a non-scalar key, such as? [a], throws.<<merge keys still work.
MCP connections over Streamable HTTP now fail when theserver/discoverrequest fails before the server answers, instead of retrying withinitialize. SetprotocolVersionDiscovery: falsefor a server that can't handle that request. Servers that answerserver/discoverwith a JSON-RPC error or an HTTP error status other than401still useinitialize, and servers that reject the protocol version with a supported legacy version still negotiate it. (#6378) - Fix
eve devrequests that use a sandbox failing withENOENT … sandbox-preparation.lockwhen another request finished preparing sandboxes at the same time.
These requests now wait for the other request and continue, as they already did while preparation was in progress. (#6388) - Keep an answered ephemeral Slack card in its thread instead of also showing it at the top of the channel. (#6381)
- When
eve__task_waitreturns with one task's result while others are still working, the result now tells the model to wait again if its reply needs the rest, so it no longer sends a partial answer first. (#6380)