Repository navigation
Wolverine 6.33.0
The headline is a new package. WolverineFx.AI makes a one shot LLM call an ordinary Wolverine message: durable, outbox enrolled, retried by the same rules as everything else, and testable without a model anywhere in sight.
WolverineFx.AI (new package)
An LlmCallout is a message. Return one from a handler next to your storage action and it is enrolled in that handler's outbox, so a callout cannot fire for a transaction that did not commit and cannot be lost to a restart in between. The model's answer comes back as an ordinary cascading message, with an ordinary handler, an ordinary retry policy, and its own place in the correlation chain. (closes #4227)
- Spend guardrails as middleware on the callout queue.
LlmBudget.MaximumPromptCharactersrefuses a runaway prompt before your provider is ever called;MaximumTokensPerWindowrefuses callouts once the node has burned its allowance. Both dead letter rather than retry, and so does an answer that cannot be parsed into the response type you asked for -- retrying either is the runaway spend the budget exists to stop. - A scripted
IChatClientfor testing.StubChatClientexercises a callout's whole round trip with no key, no network and no model. - Trim and AOT clean, guarded by a
Wolverine.AI.AotSmokeproject underTrimMode=fullthat CI runs. (closes #4230) - Documentation for tuning it, new in this release: how to control parallelism against your provider, why the answer has its own queue with its own settings, and how to bring your own error handling on both sides.
The package references only the Microsoft.Extensions.AI abstractions, never a vendor SDK. The provider -- Anthropic, OpenAI, Azure, Ollama -- and any middleware over it stay your choice.
Fixes
- A node no longer sweeps up its own in-flight stop as a wedged shard. An event-subscription agent could end up running on two nodes at once while
wolverine_nodescredited only one, so nothing in the system could ever stop the extra copy. (closes #4240) - Node record descriptions no longer overflow the column and fail the insert. An
AssignmentChangeddescription carries an agent URI, a schema name and a destination node, which on a real cluster overran thedescriptioncolumn and failed the wholeAgentCommandbatch behind it. MySQL was worst hit atVARCHAR(255). (closes #4246) - DataAnnotations validation works with
ServiceLocationPolicy.NotAllowed-- on HTTP endpoints and, now, on message handlers. Under the Wolverine 6 default this made the validation middleware unusable and threw at bootstrap. (closes #4238) - A failed EF Core rollback no longer displaces the exception that caused it. (closes #4239)
- Wolverine parameter attributes work on gRPC before/after hooks --
[Entity],[All],[Queryable],[WriteAggregate]and the rest. (closes #3935) - An application-wide default duplicate status code via
opts.DefaultDuplicateStatusCode, and deduplication refusals now advertise their problem document in OpenAPI. - Concurrent
IHost.StopAsyncno longer tears the agents down twice.
Upgrade note
6.33.0 requires Weasel 9.30.0, and that raises the GH-4246 fix from "new databases only" to "existing ones too": the schema differ now compares character lengths, so a widened varchar is no longer invisible to it and an existing table is corrected in place by an ALTER TABLE ... MODIFY that keeps its rows.
Worth knowing before you upgrade: that comparison runs in both directions. Width drift that was previously invisible now generates ALTERs, and a model narrower than an existing column will emit a narrowing ALTER that can fail on real data. Sizes that are not character lengths -- a MySQL int(11) display width, a decimal precision, a datetime fsp -- are still ignored.
Dependencies
JasperFx 2.60.0, Marten 9.30.0, Polecat 5.21.1, Fisher 1.0.6, Weasel 9.30.0.