Release v0.0.76
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;inputsis an array ofrole/contentmessages, andparameterscarries provider-specific string values (model,maxTokens, …). - Optional
metadata,contextId(stateful conversations),temperature,scrubPII, andtimeoutSeconds(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(orttlSeconds) 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
Acquireon 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 manualReleaseon every terminal transition. Releaseis idempotent/best-effort —LockDoesNotExistcounts as success, a foreign lock is logged (not faulted), and lock cleanup never rolls back a successful business transition.- A conflict on
Acquireaborts the transition and returns HTTP 409 (the instance is marked faultedF); the caller retries.Extendis 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-Typepreserved without charset suffix — function output scripts that setcontent-typekeep 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-cachevaryByHeaders/varyByHeaderPrefixesfields (#839), the workflow-levelattributes.configobject (config.functionCache) (#846), and the transitionresourceLockdefinition (#840). Update@burgan-tech/vnext-schemain 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 —
varyKeycache-key helper + config-driven vary-by headers. - vnext #846 — Consolidate flow-level
functionCacheunder aconfigobject. - 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-Typewithout 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/varyByHeaderPrefixesfeed thevaryKey(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-Typepreserved, case-insensitive header matching, init mappings support for publish. - Schema is 0.0.51.
vNext Runtime Platform Team Released July 27, 2026
