0.5.1 — Provider-neutral declarative capabilities + dashboard browse
Capstead 0.5.1
Declarative capabilities are now provider-neutral, and the dashboard is browsable even before any executions.
✨ Provider-neutral declarative capabilities
@CapabilityClient no longer requires Spring AI. Capstead renders prompts, resolves model profiles, binds structured output, and governs the call — and delegates only the model call to a one-method SPI you implement (or the Spring AI default):
@Bean
CapabilityModelInvoker modelInvoker(MyLlmClient llm) { // LangChain4j, an SDK, raw HTTP…
return req -> llm.complete(req.model(), req.systemPrompt(), req.userPrompt());
}- New SPI in
capstead-runtime:CapabilityModelInvoker+CapabilityModelRequest. - The declarative engine moved into
capstead-starter(no Spring AI dependency). capstead-spring-ainow provides the default Spring AIChatClient-backed invoker — Spring AI users need no bean.- Structured output is bound provider-neutrally (JSON → your return type).
Full guide: docs/DECLARATIVE-CAPABILITIES.md.
🖥️ Dashboard: browse registered capabilities with no executions
The dashboard now merges the catalog with scorecards, so every registered @Capability is listed even before it runs — unexecuted capabilities show a "No runs" badge and are still clickable to their metadata (owner, domain, version, tags). Fixes the dead-end where clicking a domain with no recorded executions showed a blank page.
📦 Get it
<dependency>
<groupId>io.capstead</groupId>
<artifactId>capstead-starter</artifactId>
<version>0.5.1</version>
</dependency>
<!-- Optional: default Spring AI ChatClient invoker for declarative capabilities -->
<dependency>
<groupId>io.capstead</groupId>
<artifactId>capstead-spring-ai</artifactId>
<version>0.5.1</version>
</dependency>Runnable example (no API keys, no Spring AI): samples/.