Skip to main content

Release v0.0.76

Β· 8 min read
vNext Team
Burgan Tech Engineering

Overview​

This release adds AI to the task palette and sharpens the caching and concurrency primitives. A new Dapr Conversation task (TaskType = 20) invokes an LLM/AI provider (OpenAI, Anthropic, Bedrock, …) provider-agnostically through the Dapr Conversation building block (#844). Function result caching gains vary-by headers β€” varyByHeaders / varyByHeaderPrefixes feed a varyKey(context) key-expression helper so one function keeps separate cache variants per header value (#839). Flow-level cache tuning is consolidated under a single attributes.config object (config.functionCache.ttlSeconds), the author-controlled TTL for the built-in instance functions (#846). Distributed resource locks become production-ready with idempotent release and automatic terminal cleanup (#840), plus a per-subInstance lock key for subflow terminal-outcome propagation (#845). Wizard states are now treated like normal states in the State/View functions (#838). The release also fixes author Content-Type preservation (#847), case-insensitive request-header normalization (#841), and init mappings support for publish (#848). This release runs on component schema 0.0.51.


Features​

Dapr Conversation task β€” provider-agnostic LLM calls (#844)​

A new task type, DaprConversation (TaskType = 20), invokes an LLM/AI provider through Dapr's Conversation building block β€” the same sidecar the other Dapr task types use. The provider and its credentials live in a domain-owned Dapr conversation component (e.g. openai); the task only references the component name and the messages.

{
"attributes": {
"type": "20",
"config": {
"componentName": "openai",
"inputs": [
{ "role": "system", "content": "You summarize customer complaints." },
{ "role": "user", "content": "Summarize the complaint in two sentences." }
],
"parameters": { "model": "gpt-4o-mini", "maxTokens": "512" },
"temperature": 0.2,
"scrubPII": true
}
}
}
  • Required config is just componentName; inputs is an array of role/content messages, and parameters carries provider-specific string values (model, maxTokens, …).
  • Optional metadata, contextId (stateful conversations), temperature, scrubPII, and timeoutSeconds (default 30).
  • The runtime component is installed via the helm chart (vnext-helm-charts #28), so shipping a new provider needs no runtime redeploy.

Reference: issue #844, helm PR vnext-helm-charts #28 β€” see also the new Dapr Conversation Task component page.

Function cache vary-by headers (#839)​

The function attributes.cache block gains two fields β€” varyByHeaders (exact request-header names) and varyByHeaderPrefixes (header-name prefixes) β€” that fold the named headers into the cache key. They form the header-name set for the varyKey(context) key-expression helper (the two lists are unioned), so a single read function keeps separate cache variants per header value without the runtime baking in any header convention. When the instance does not supply its own Instance.Data["varyBy"], these domain-declared fields are used.

Reference: issue #839 β€” see also Custom Functions β†’ Cache.

Flow-level cache config object (#846)​

Author-controlled, flow-scoped cache tuning is now consolidated under a single attributes.config object. Its first member, functionCache.ttlSeconds, is the TTL for this workflow's built-in instance functions (data, view, schema, …).

{ "config": { "functionCache": { "ttlSeconds": 120 } } }
  • Repeat calls for the same instance are served from cache for the TTL window; when the instance changes, the cache drops and the next call is re-cached.
  • The host default is 60s when config (or ttlSeconds) is absent or non-positive.
  • The State Function is excluded β€” the platform manages its cache separately (host-side StateFunctionCache).

Reference: issue #846 β€” see also Workflow component β†’ Config.

Distributed resource locks β€” idempotent release + automatic cleanup (#840, #845)​

Start, state-level, and shared transitions can declare an optional resourceLock block β€” a distributed lock (Dapr lock.redis, via the Aether SDK) that prevents concurrent instances from mutating a shared resource (a seat, daily limit, account, …). It runs in the Manual profile only, is owned by the instanceId, and always carries a TTL.

{
"key": "reserve-daily-limit",
"target": "limit-reserved",
"triggerType": 0,
"versionStrategy": "Patch",
"resourceLock": {
"keyExpression": { "location": "./src/DailyLimitKey.csx", "code": "<base64>", "type": "L", "encoding": "NAT" },
"action": "Acquire",
"ttlSeconds": 300,
"onConflict": "Abort"
}
}
  • The recommended model is Acquire on the check/entry transition and let the runtime release it: when the instance reaches a terminal state (Completed / Faulted / Cancelled), its locks are released automatically β€” no manual Release on every terminal transition.
  • Release is idempotent/best-effort β€” LockDoesNotExist counts as success, a foreign lock is logged (not faulted), and lock cleanup never rolls back a successful business transition.
  • A conflict on Acquire aborts the transition and returns HTTP 409 (the instance is marked faulted F); the caller retries. Extend is unreliable (no native Dapr extend) β€” size the TTL to cover the whole operation.
  • Subflows now derive a per-subInstance lock key so terminal-outcome propagation stays correct across nested instances (#845).

Reference: issues #840, #845 β€” see also the new Resource Lock guide and Workflow component β†’ Transition.

Wizard states behave like normal states in read functions (#838)​

The State and View functions now treat Wizard states like normal states: authorization/role evaluation and the available-transition list are resolved the same way, so a wizard state's state/view response is consistent with any other state. This removes the special-casing that previously diverged wizard-state reads.

Reference: issue #838 β€” see also Workflow component β†’ Wizard State ve View Davranışı.


Fixes​

  • Author Content-Type preserved without charset suffix β€” function output scripts that set content-type keep the author value verbatim (the ; charset=... suffix is no longer appended) (#847).
  • Case-insensitive request-header normalization β€” transition request headers are matched case-insensitively, so header lookups no longer miss on casing differences (#841).
  • Init mappings support for publish β€” the init/publish path handles mapping components correctly (#848).

Configuration Updates​

Configuration for v0.0.76:

{
"runtimeVersion": "0.0.76",
"schemaVersion": "0.0.51"
}

Note: Schema version advances to 0.0.51 (from 0.0.50). The bump adds the DaprConversation task type "20" (#844), the function-cache varyByHeaders / varyByHeaderPrefixes fields (#839), the workflow-level attributes.config object (config.functionCache) (#846), and the transition resourceLock definition (#840). Update @burgan-tech/vnext-schema in your domain project before validating against this runtime.

Container images: published at tag 0.0.76 under ghcr.io/burgan-tech/vnext/*, Cosign-signed (keyless OIDC) with SBOM + provenance. Immutable digests are listed in the GitHub release.


Issues Referenced​

  • vnext #844 β€” Dapr Conversation (AI/LLM) task type.
  • vnext #839 β€” varyKey cache-key helper + config-driven vary-by headers.
  • vnext #846 β€” Consolidate flow-level functionCache under a config object.
  • vnext #840 β€” Resource lock: idempotent release + automatic terminal cleanup.
  • vnext #845 β€” Retryable 503 + per-subInstance lock key for terminal-outcome propagation.
  • vnext #838 β€” Treat wizard states like normal states in State/View functions.
  • vnext #847 β€” Preserve author Content-Type without charset suffix.
  • vnext #841 β€” Normalize request headers case-insensitively.
  • vnext #848 β€” Init mappings support for publish.
  • vnext-helm-charts #28 β€” Dapr Conversation helm component.

Summary​

  • Dapr Conversation task (Type 20) invokes an LLM/AI provider provider-agnostically through the Dapr Conversation building block; the provider is a domain-owned Dapr component.
  • Function cache vary-by headers: varyByHeaders / varyByHeaderPrefixes feed the varyKey(context) helper for per-header cache variants.
  • Flow-level config.functionCache.ttlSeconds: author-controlled TTL for built-in instance functions (host default 60s; State Function excluded).
  • Distributed resource locks are production-ready: idempotent release, automatic terminal cleanup, HTTP 409 on conflict, and a per-subInstance lock key for subflows.
  • Wizard states are read like normal states in the State/View functions.
  • Fixes: author Content-Type preserved, case-insensitive header matching, init mappings support for publish.
  • Schema is 0.0.51.

vNext Runtime Platform Team Released July 27, 2026