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
