Quarkus + Langchain4j Dapr Workflows extension + Agent registry#1693
Quarkus + Langchain4j Dapr Workflows extension + Agent registry#1693salaboy wants to merge 16 commits into
Conversation
ec48d2c to
1cffa21
Compare
590453f to
16f9092
Compare
|
@javier-aliaga @cicoyle @siri-varma @artur-ciocanu I will appreciate reviews on this PR |
4d58a77 to
0777814
Compare
There was a problem hiding this comment.
Pull request overview
Initial implementation of a Quarkus extension that integrates LangChain4j Agentic workflows with Dapr Workflows, plus an agent registry module and runnable examples, aligned with issue #1688.
Changes:
- Adds a new
quarkus/multi-module build with runtime/deployment modules for Dapr Workflows–backed LangChain4j agent orchestration. - Introduces an agent registry module that auto-discovers
@Agentmethods and persists agent metadata into a Dapr state store. - Adds Quarkus examples and tests (including Dev Services/Testcontainers-based integration tests) plus supporting build/config updates.
Reviewed changes
Copilot reviewed 95 out of 95 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| spotbugs-exclude.xml | Extends SpotBugs exclusions to io.quarkiverse.dapr.* packages. |
| quarkus/runtime/src/test/java/io/quarkiverse/dapr/langchain4j/workflow/orchestration/OrchestrationInputTest.java | Unit tests for orchestration input record. |
| quarkus/runtime/src/test/java/io/quarkiverse/dapr/langchain4j/workflow/orchestration/InputRecordsTest.java | Unit tests for activity input records. |
| quarkus/runtime/src/test/java/io/quarkiverse/dapr/langchain4j/workflow/orchestration/ActivitiesTest.java | Unit tests for orchestration activities behavior. |
| quarkus/runtime/src/test/java/io/quarkiverse/dapr/langchain4j/workflow/DaprWorkflowPlannerTest.java | Unit tests for planner lifecycle and metadata extraction. |
| quarkus/runtime/src/test/java/io/quarkiverse/dapr/langchain4j/workflow/DaprWorkflowAgentsBuilderTest.java | Tests SPI discovery and builder wiring for agent services. |
| quarkus/runtime/src/test/java/io/quarkiverse/dapr/langchain4j/workflow/DaprPlannerRegistryTest.java | Tests planner registry operations. |
| quarkus/runtime/src/test/java/io/quarkiverse/dapr/langchain4j/workflow/DaprAgentServiceUtilTest.java | Tests workflow-safe name sanitization utility. |
| quarkus/runtime/src/test/java/io/quarkiverse/dapr/langchain4j/memory/KeyValueChatMemoryStoreTest.java | Tests Dapr state-store-backed chat memory store. |
| quarkus/runtime/src/main/resources/META-INF/services/dev.langchain4j.agentic.workflow.WorkflowAgentsBuilder | Registers WorkflowAgentsBuilder implementation via SPI. |
| quarkus/runtime/src/main/resources/META-INF/quarkus-extension.yaml | Adds Quarkus extension descriptor metadata. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/workflow/orchestration/activities/ExitConditionCheckActivity.java | Adds Dapr activity for loop exit-condition evaluation. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/workflow/orchestration/activities/ConditionCheckActivity.java | Adds Dapr activity for conditional-agent gating. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/workflow/orchestration/activities/AgentExecutionActivity.java | Adds bridging activity to enqueue agent execution and register per-run context. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/workflow/orchestration/SequentialOrchestrationWorkflow.java | Adds sequential orchestration workflow implementation. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/workflow/orchestration/ParallelOrchestrationWorkflow.java | Adds parallel orchestration workflow implementation. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/workflow/orchestration/OrchestrationInput.java | Adds shared orchestration input record. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/workflow/orchestration/LoopOrchestrationWorkflow.java | Adds loop orchestration workflow implementation. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/workflow/orchestration/ExitConditionCheckInput.java | Adds activity input record for loop exit-condition checks. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/workflow/orchestration/ConditionalOrchestrationWorkflow.java | Adds conditional orchestration workflow implementation. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/workflow/orchestration/ConditionCheckInput.java | Adds activity input record for conditional checks. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/workflow/orchestration/AgentExecInput.java | Adds activity input record for agent execution bridge. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/workflow/WorkflowNameResolver.java | Adds resolver for workflow registration names (annotation-aware). |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/workflow/DaprWorkflowAgentsBuilder.java | Adds CDI-based builder for Dapr-backed agent services. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/workflow/DaprSequentialAgentService.java | Adds Dapr-backed sequential agent service implementation. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/workflow/DaprPlannerRegistry.java | Adds in-process static registry for planners. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/workflow/DaprParallelAgentService.java | Adds Dapr-backed parallel agent service implementation. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/workflow/DaprLoopAgentService.java | Adds Dapr-backed loop agent service implementation. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/workflow/DaprConditionalAgentService.java | Adds Dapr-backed conditional agent service implementation. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/workflow/DaprAgentServiceUtil.java | Adds shared utilities for workflow identifier safety. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/workflow/DaprAgentService.java | Adds marker interface for Dapr-backed agent services. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/memory/KeyValueChatMemoryStore.java | Adds Dapr state-store-backed LangChain4j ChatMemoryStore. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/agent/workflow/AgentRunWorkflow.java | Adds per-agent workflow to execute tool/LLM activities and maintain custom status. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/agent/workflow/AgentRunOutput.java | Adds aggregated workflow output record for observability. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/agent/workflow/AgentRunInput.java | Adds input record for per-agent workflow execution. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/agent/workflow/AgentEvent.java | Adds external-event record used to drive the per-agent workflow. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/agent/activities/ToolCallOutput.java | Adds tool-call activity output record. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/agent/activities/ToolCallInput.java | Adds tool-call activity input record. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/agent/activities/ToolCallActivity.java | Adds activity that executes intercepted @Tool calls. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/agent/activities/LlmCallOutput.java | Adds LLM-call activity output record. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/agent/activities/LlmCallInput.java | Adds LLM-call activity input record. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/agent/activities/LlmCallActivity.java | Adds activity that executes intercepted ChatModel calls. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/agent/DaprToolCallInterceptor.java | Adds CDI interceptor to route @Tool calls via Dapr workflows. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/agent/DaprChatModelDecorator.java | Adds decorator to route ChatModel.chat() via Dapr workflows for synthetic beans. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/agent/DaprAgentToolInterceptorBinding.java | Adds interceptor binding annotation for tool interception. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/agent/DaprAgentRunRegistry.java | Adds static registry for per-agent run contexts. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/agent/DaprAgentMethodInterceptor.java | Adds interceptor to start per-agent workflow for non-synthetic CDI @Agent methods. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/agent/DaprAgentMetadataHolder.java | Adds thread-local metadata holder for agent name/prompt templates. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/agent/DaprAgentInterceptorBinding.java | Adds interceptor binding annotation for @Agent methods. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/agent/DaprAgentContextHolder.java | Adds thread-local context holder for agent run id routing. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/agent/AgentRunLifecycleManager.java | Adds request-scoped lifecycle manager for lazily started per-agent workflows. |
| quarkus/runtime/src/main/java/io/quarkiverse/dapr/langchain4j/agent/AgentRunContext.java | Adds synchronization context for pending tool/LLM calls. |
| quarkus/runtime/pom.xml | Introduces runtime module Maven config/deps for the extension. |
| quarkus/quarkus-agentic-dapr-agents-registry/src/test/resources/application.properties | Configures registry tests with Dapr Dev Services and mock OpenAI settings. |
| quarkus/quarkus-agentic-dapr-agents-registry/src/test/java/io/quarkiverse/dapr/agents/registry/service/TestAgentBean.java | Adds CDI bean implementing an agent interface for discovery tests. |
| quarkus/quarkus-agentic-dapr-agents-registry/src/test/java/io/quarkiverse/dapr/agents/registry/service/TestAgent.java | Adds test agent interface with varied @Agent metadata. |
| quarkus/quarkus-agentic-dapr-agents-registry/src/test/java/io/quarkiverse/dapr/agents/registry/service/MockChatModel.java | Adds mock chat model for registry integration tests. |
| quarkus/quarkus-agentic-dapr-agents-registry/src/test/java/io/quarkiverse/dapr/agents/registry/service/AgentRegistryTest.java | Adds unit tests for reflection-based agent scanning. |
| quarkus/quarkus-agentic-dapr-agents-registry/src/test/java/io/quarkiverse/dapr/agents/registry/service/AgentRegistryDevServicesTest.java | Adds Dev Services integration tests validating state-store registration. |
| quarkus/quarkus-agentic-dapr-agents-registry/src/main/resources/META-INF/beans.xml | Enables bean discovery for registry module. |
| quarkus/quarkus-agentic-dapr-agents-registry/src/main/java/io/quarkiverse/dapr/agents/registry/service/AgentRegistry.java | Implements startup discovery and state-store registration of agents. |
| quarkus/quarkus-agentic-dapr-agents-registry/src/main/java/io/quarkiverse/dapr/agents/registry/model/ToolMetadata.java | Adds registry model types (tool metadata). |
| quarkus/quarkus-agentic-dapr-agents-registry/src/main/java/io/quarkiverse/dapr/agents/registry/model/RegistryMetadata.java | Adds registry model types (registry metadata). |
| quarkus/quarkus-agentic-dapr-agents-registry/src/main/java/io/quarkiverse/dapr/agents/registry/model/PubSubMetadata.java | Adds registry model types (pub/sub metadata). |
| quarkus/quarkus-agentic-dapr-agents-registry/src/main/java/io/quarkiverse/dapr/agents/registry/model/MemoryMetadata.java | Adds registry model types (memory metadata). |
| quarkus/quarkus-agentic-dapr-agents-registry/src/main/java/io/quarkiverse/dapr/agents/registry/model/LlmMetadata.java | Adds registry model types (LLM metadata). |
| quarkus/quarkus-agentic-dapr-agents-registry/src/main/java/io/quarkiverse/dapr/agents/registry/model/AgentMetadataSchema.java | Adds schema wrapper for agent registration payload. |
| quarkus/quarkus-agentic-dapr-agents-registry/src/main/java/io/quarkiverse/dapr/agents/registry/model/AgentMetadata.java | Adds agent metadata payload model. |
| quarkus/quarkus-agentic-dapr-agents-registry/pom.xml | Adds registry module Maven config/deps. |
| quarkus/pom.xml | Adds Quarkus parent/module structure and dependency management overrides. |
| quarkus/examples/src/test/resources/application.properties | Enables Dapr Dev Services + OpenAI test config for examples. |
| quarkus/examples/src/test/java/io/quarkiverse/dapr/examples/StoryResourceTest.java | Adds integration tests for /story endpoint. |
| quarkus/examples/src/test/java/io/quarkiverse/dapr/examples/ParallelResourceTest.java | Adds integration tests for /parallel endpoint. |
| quarkus/examples/src/test/java/io/quarkiverse/dapr/examples/MockChatModel.java | Adds test mock model for examples. |
| quarkus/examples/src/test/java/io/quarkiverse/dapr/examples/DockerAvailableCondition.java | Adds conditional test disabling when Docker isn’t available. |
| quarkus/examples/src/test/java/io/quarkiverse/dapr/examples/DaprWorkflowClientTest.java | Verifies dev services provides DaprWorkflowClient. |
| quarkus/examples/src/main/resources/application.properties | Adds example runtime config (Dev Services, OpenTelemetry, LangChain4j tracing). |
| quarkus/examples/src/main/java/io/quarkiverse/dapr/examples/StyleEditor.java | Adds example sub-agent interface. |
| quarkus/examples/src/main/java/io/quarkiverse/dapr/examples/StoryResource.java | Adds example REST endpoint for sequential workflow. |
| quarkus/examples/src/main/java/io/quarkiverse/dapr/examples/StoryCreator.java | Adds example composite agent using @SequenceAgent. |
| quarkus/examples/src/main/java/io/quarkiverse/dapr/examples/ResearchWriter.java | Adds example agent that uses tools (ToolBox). |
| quarkus/examples/src/main/java/io/quarkiverse/dapr/examples/ResearchTools.java | Adds example tool CDI bean with @Tool methods. |
| quarkus/examples/src/main/java/io/quarkiverse/dapr/examples/ResearchResource.java | Adds example REST endpoint for tool-routing workflow. |
| quarkus/examples/src/main/java/io/quarkiverse/dapr/examples/ParallelStatus.java | Adds example DTO for parallel endpoint response. |
| quarkus/examples/src/main/java/io/quarkiverse/dapr/examples/ParallelResource.java | Adds example REST endpoint for parallel workflow. |
| quarkus/examples/src/main/java/io/quarkiverse/dapr/examples/ParallelCreator.java | Adds example composite agent using @ParallelAgent. |
| quarkus/examples/src/main/java/io/quarkiverse/dapr/examples/CreativeWriter.java | Adds example sub-agent interface. |
| quarkus/examples/pom.xml | Adds examples module Maven config/deps. |
| quarkus/deployment/pom.xml | Adds Quarkus deployment module Maven config/deps. |
| pom.xml | Adds quarkus module, pins durabletask proto URL, updates compiler settings. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
You can also share your feedback on Copilot code review. Take the survey.
| <!-- We are following test containers artifact convention on purpose, don't rename --> | ||
| <module>testcontainers-dapr</module> | ||
| <module>durabletask-client</module> | ||
| <module>quarkus</module> |
There was a problem hiding this comment.
This new module should be independent from dapr-sdk and have its own release process
There was a problem hiding this comment.
We can send this code to quarkus-Dapr. @yaron2 which comments, can you be more specific?
There was a problem hiding this comment.
lets keep it here, but not as a module of the sdk, it will have a different release process
|
@salaboy please see comments and conflicts. thanks! |
|
I am quite aligned with Javi’s comments. Those decisions needs to be made
to move forward.
- Blog: http://salaboy.com <http://salaboy.wordpress.com>
- Github user: http://github.com/salaboy
- Twitter: http://twitter.com/salaboy
- Mauricio "Salaboy" Salatino -
…On Tue, 14 Apr 2026 at 01:48, Yaron Schneider ***@***.***> wrote:
*yaron2* left a comment (dapr/java-sdk#1693)
<#1693 (comment)>
@salaboy <https://github.com/salaboy> please see comments and conflicts.
thanks!
—
Reply to this email directly, view it on GitHub
<#1693 (comment)>, or
unsubscribe
<https://github.com/notifications/unsubscribe-auth/AACCMXRGF6VD62RXT2UCCAL4VV4GLAVCNFSM6AAAAACWNFCQXGVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHM2DENBQGMZTCMZRGU>
.
You are receiving this because you were mentioned.Message ID:
***@***.***>
|
11f7e66 to
6fdb204
Compare
mcruzdev
left a comment
There was a problem hiding this comment.
Hi @salaboy @javier-aliaga it looks really great, I left a comment.
There was a problem hiding this comment.
It is very important to be sure that the extension can run in native mode, I think we need to add it here.
There was a problem hiding this comment.
I will do it in a followup PR, this one is getting too much bigger
21d2e92 to
9cd675d
Compare
02b0b4e to
a43dfe2
Compare
Quarkus extension bridging LangChain4j agents with Dapr Workflows. Every LLM call and tool call becomes a durable Dapr activity. Includes runtime/deployment modules, agent registry, CI workflows, orchestration (sequential, parallel, loop, conditional), and built-in examples. NEWMSG "$@" Signed-off-by: Javier Aliaga <javier@diagrid.io>
Add team index for dapr-agents format, register composite agents with their LangChain4j type, move packages from io.quarkiverse.dapr to io.dapr.quarkus, add independent CI build/release workflows, and decouple quarkus version from SDK for independent releases. NEWMSG "$@" Signed-off-by: Javier Aliaga <javier@diagrid.io>
New quarkus-langchain4j-dapr module that bridges LangChain4j's ChatModel to the Dapr Conversation API. Swap LLM providers by changing the Dapr component config — no Java code changes needed. - DaprConversationChatModel: implements ChatModel using converseAlpha2() - DaprConversationRecorder: produces ChatModel via Quarkus @recorder - DaprConversationProcessor: registers as a langchain4j model provider - Supports tool calls (function calling) through the Dapr API Configuration: quarkus.langchain4j.dapr.component-name=llm quarkus.langchain4j.dapr.temperature=0.7 Signed-off-by: Javier Aliaga <javier@diagrid.io>
When the process crashes mid-agent-execution, Dapr replays the workflow and completed activities return cached results. The in-progress activity fails with TaskFailedException because the in-memory AgentRunContext is gone. AgentRunWorkflow catches this and delegates to RecoveryAgentActivity, which re-runs the agent's entire ReAct loop from scratch using ChatModel.chat() directly and ToolRegistry for tool dispatch — bypassing LangChain4j AiServices entirely. New classes: RecoveryAgentActivity, RecoveryAgentInput/Output, ToolRegistry (CDI @tool scanner), AgentToolClassRegistry (build-time agent→toolbox mapping). AgentRunInput/Output extended with toolClassNames and recoveryResult fields. Signed-off-by: Javier Aliaga <javier@diagrid.io>
… prompt formatting DaprChatModelDecorator: replace String.valueOf(messages) with compact formatMessage() that omits null fields and formats each message type (SystemMessage, UserMessage, AiMessage with tool_calls, ToolResult). LlmCallActivity: when aiMessage.text() is null (tool execution requests), format as "[tool_calls: name1, name2]" instead of returning "null". Signed-off-by: Javier Aliaga <javier@diagrid.io>
- Recovery falls back to all tools when the @toolbox class list is empty - RecoveryAgentActivity throws on max iterations instead of returning a sentinel string that downstream treats as a valid agent result - Warn when synthetic parameter names (arg0...) are detected in tool arg parsing (missing -parameters compiler flag) - Orchestration workflows release the blocked planner thread on real failures while letting OrchestratorBlockedException propagate untouched - Generated agent decorator clears DaprAgentMetadataHolder after the fallback delegate call instead of leaking the ThreadLocal - LLM/tool call futures use a configurable timeout (dapr.agentic.call-timeout-minutes, default 10) instead of waiting forever - ToolRegistry sets non-public @tool methods accessible for recovery - DaprChatModelWrapper fails fast with a descriptive error when no ChatModel provider is configured Signed-off-by: Javier Aliaga <javier@diagrid.io>
Move ${{ inputs.rel_version }} from inline shell interpolation to the
step's env block so the value is read as data, not substituted into the
script before shell evaluation.
Signed-off-by: Javier Aliaga <javier@diagrid.io>
- Bump parent and dapr.sdk.version from 1.18.0 to 1.19.0-SNAPSHOT: master bumped the root POM, so the quarkus parent failed to resolve via relativePath and every CI job died at reactor load - Add the central snapshots repository: the quarkus CI job builds this tree standalone, so SDK SNAPSHOT artifacts must be resolvable (remove when dapr.sdk.version is pinned to a release) - Pin testcontainers to 2.0.3 (quarkus-bom aligned): the root POM's 2.0.5 requires a newer docker-java than quarkus-bom's 3.7.0, breaking dev services with NoClassDefFoundError: ImageHistoryCmd Signed-off-by: Javier Aliaga <javier@diagrid.io>
…licts
- DaprWorkflowPlannerTest: planner now schedules the agent-specific
workflow name (dapr.langchain4j.Test.workflow), not 'sequential-agent'
- AgentRegistry tests: agent type is the LangChain4j annotation name
('Agent'), not 'standalone'; team index assertion tolerates other
test fixtures
- Raise MockChatModel priority to 100: it tied with DaprChatModelWrapper
(@Alternative @priority(1)), making the ChatModel injection ambiguous
- Load gRPC/protobuf/Jackson parent-first in dev-services tests: the
Dapr SDK uses them across the QuarkusTest classloader boundary,
failing startup with LinkageError otherwise
- Quarantine StoryResourceTest and ParallelResourceTest: known race in
the in-memory planner bridge (duplicate agent-call activity dispatch +
FIFO completion correlation) hangs back-to-back/parallel requests;
tracked for follow-up
Signed-off-by: Javier Aliaga <javier@diagrid.io>
…ntime - dapr.sdk.version: 1.19.0-SNAPSHOT -> 1.18.0-rc-3 (released, on Maven Central) so quarkus modules build against a stable SDK - Drop the snapshots repository: no longer needed with a released pin - Pin dev services to daprio/daprd:1.18.0-rc.4 — the canonical runtime hardcoded by testcontainers-dapr 1.18.0-rc-3 (daprd/placement/scheduler); Testcontainers rejects other tags as incompatible substitutes Signed-off-by: Javier Aliaga <javier@diagrid.io>
Implements LangChain4j's AgenticScopeStore SPI over the Dapr state API — the LangChain4j equivalent of a LangGraph checkpointer. When enabled, AgenticScopeRegistry persists every scope update (shared state, conversation context, agent invocations), so agentic workflow state survives restarts and is shareable across replicas. - DaprAgenticScopeStore: save/load/delete via AgenticScopeSerializer (LangChain4j's own Jackson codec); companion _index key for getAllKeys - AgenticScopeStoreInitializer: opt-in via dapr.agentic.scope-store.enabled / dapr.agentic.scope-store.name, registered with AgenticScopePersister at startup Signed-off-by: Javier Aliaga <javier@diagrid.io>
…H_EXCEPTION The try block only throws ReflectiveOperationException and runtime exceptions; catching Exception fails spotbugs:check, which gates the root Build/Javadocs CI jobs. Signed-off-by: Javier Aliaga <javier@diagrid.io>
- Replace <p><h3> with <h2> (doclint: empty <p> tag + heading out of
sequence after implicit H1)
- Fix stale {@link} references: DaprLlmCallInterceptor (removed class,
now DaprChatModelDecorator), unqualified AgentRunWorkflow from the
agent package, and quarkiverse-internal WorkflowItemBuildItem
These only surfaced once SpotBugs stopped aborting the aggregate run.
Signed-off-by: Javier Aliaga <javier@diagrid.io>
…mages - dapr.sdk.version: 1.18.0-rc-3 -> 1.18.0 (released on Maven Central) - Dev services: daprio/daprd:1.18.0 — the canonical image pinned by testcontainers-dapr 1.18.0 (daprd/placement/scheduler all final) Signed-off-by: Javier Aliaga <javier@diagrid.io>
Three coordinated fixes to the planner bridge: 1. Identity-based completion correlation: nextAction() now correlates each completion via PlanningContext.previousAgentInvocation().agentId() instead of FIFO-polling deques. Parallel completion order is arbitrary, so FIFO routed done/agent-complete events to the wrong agent run and hung the orchestration. 2. Idempotent agent submission: agent-call activities are delivered at-least-once; executeAgent() now dedupes by agentRunId so a redelivery cannot run the agent twice, and AgentExecutionActivity no longer replaces an in-flight AgentRunContext (which orphaned pending calls). 3. Per-thread Dapr context via decorator binding: the planner cannot set DaprAgentContextHolder on LangChain4j's parallel executor threads, so parallel agents' LLM/tool calls silently bypassed Dapr (no durability, no audit trail). AgentExecutionActivity now binds agentName→agentRunId and the generated CDI decorator claims the binding on the agent's own thread, routing every call through its AgentRunWorkflow. StoryResourceTest and ParallelResourceTest are un-quarantined and green — including the nested @sequenceagent inside @ParallelAgent scenario. Remaining known flake (documented in README): daprd 1.18.0 can lose a child workflow completion (child completes app-side but stays RUNNING in daprd; its new-event reminder fires on an empty inbox), hanging ~1 in 6 multi-request runs. The examples suite retries once to absorb it; needs an upstream dapr/dapr issue. Signed-off-by: Javier Aliaga <javier@diagrid.io>
The daprd 1.18.0 save-before-dispatch race (workflow event lost: app-side completion while daprd keeps the workflow RUNNING, event reminder firing on an empty inbox) hangs most e2e requests on slow CI runners — retry-once cannot converge there. Skip StoryResourceTest and ParallelResourceTest when CI=true; they keep running locally where the race is ~1 in 6 and absorbed by the retry. DaprWorkflowClientTest still runs on CI for boot and dev services coverage. Signed-off-by: Javier Aliaga <javier@diagrid.io>
61966d0 to
d0b1fa2
Compare
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## master #1693 +/- ##
=========================================
Coverage 76.86% 76.86%
Complexity 2298 2298
=========================================
Files 243 243
Lines 7141 7141
Branches 745 745
=========================================
Hits 5489 5489
Misses 1287 1287
Partials 365 365 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
Description
Initial implementation for Quarkus + Langchain4j extension for Dapr Workflows.
Issue reference
We strive to have all PR being opened based on an issue, where the problem or feature have been discussed prior to implementation.
Please reference the issue this PR will close: #1688
Checklist
Please make sure you've completed the relevant tasks for this PR, out of the following list: