Skip to content

Quarkus + Langchain4j Dapr Workflows extension + Agent registry#1693

Open
salaboy wants to merge 16 commits into
dapr:masterfrom
salaboy:1688-langchain4j
Open

Quarkus + Langchain4j Dapr Workflows extension + Agent registry#1693
salaboy wants to merge 16 commits into
dapr:masterfrom
salaboy:1688-langchain4j

Conversation

@salaboy

@salaboy salaboy commented Mar 10, 2026

Copy link
Copy Markdown
Collaborator

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:

  • Code compiles correctly
  • Created/updated tests
  • Extended the documentation

@salaboy salaboy requested review from a team as code owners March 10, 2026 14:48
@salaboy salaboy marked this pull request as draft March 10, 2026 14:49
@salaboy salaboy force-pushed the 1688-langchain4j branch 4 times, most recently from 590453f to 16f9092 Compare March 12, 2026 14:21
@salaboy salaboy marked this pull request as ready for review March 12, 2026 14:59
@salaboy salaboy changed the title [WIP - DO NOT MERGE] Quarkus + Langchain4j Dapr Workflows extension + Agent registry Quarkus + Langchain4j Dapr Workflows extension + Agent registry Mar 12, 2026
@salaboy

salaboy commented Mar 17, 2026

Copy link
Copy Markdown
Collaborator Author

@javier-aliaga @cicoyle @siri-varma @artur-ciocanu I will appreciate reviews on this PR

@salaboy salaboy force-pushed the 1688-langchain4j branch 2 times, most recently from 4d58a77 to 0777814 Compare March 17, 2026 16:16
@javier-aliaga javier-aliaga requested a review from Copilot March 18, 2026 11:40

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 @Agent methods 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.

Comment thread pom.xml
Comment thread pom.xml
<!-- We are following test containers artifact convention on purpose, don't rename -->
<module>testcontainers-dapr</module>
<module>durabletask-client</module>
<module>quarkus</module>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This new module should be independent from dapr-sdk and have its own release process

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can send this code to quarkus-Dapr. @yaron2 which comments, can you be more specific?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lets keep it here, but not as a module of the sdk, it will have a different release process

@yaron2

yaron2 commented Apr 13, 2026

Copy link
Copy Markdown
Member

@salaboy please see comments and conflicts. thanks!

@salaboy

salaboy commented Apr 14, 2026 via email

Copy link
Copy Markdown
Collaborator Author

Comment thread quarkus/pom.xml
@javier-aliaga javier-aliaga force-pushed the 1688-langchain4j branch 2 times, most recently from 11f7e66 to 6fdb204 Compare April 16, 2026 10:53
@cicoyle cicoyle added this to the v1.18 milestone Apr 17, 2026

@mcruzdev mcruzdev left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @salaboy @javier-aliaga it looks really great, I left a comment.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is very important to be sure that the extension can run in native mode, I think we need to add it here.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I will do it in a followup PR, this one is getting too much bigger

@javier-aliaga javier-aliaga force-pushed the 1688-langchain4j branch 4 times, most recently from 02b0b4e to a43dfe2 Compare June 11, 2026 08:48
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>
@codecov

codecov Bot commented Jun 11, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 76.86%. Comparing base (2d06cb4) to head (d0b1fa2).

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.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Provide Support for Quarkus extensions and Langchain4j

6 participants