Skip to content

Add Conversation AI to Java SDK #1235

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 20 commits into
base: master
Choose a base branch
from

Conversation

siri-varma
Copy link
Contributor

@siri-varma siri-varma commented Mar 6, 2025

PR Overview: Conversation AI SDK Integration

This PR introduces the Conversation AI SDK with the Converse API. The implementation is structured into the following categories:

  • Core Logic
  • Models
  • Unit Tests

Core Logic

The core logic is implemented in a key class, as detailed below:

Class Description Details
DaprConversationClient Manages the Conversation API. Handles validations and async calls. - Calls the Conversation API asynchronously.
- Validates inputs and manages job execution.

API Contracts

The following is the method signature for the Dapr Converse API:

Dapr Converse API

This method interacts with the Dapr Converse API.

Mono<DaprConversationResponse> converse(
    String conversationComponentName,
    List<DaprConversationInput> daprConversationInputs,
    String contextId,
    boolean scrubPii,
    double temperature
);
Parameter Description
conversationComponentName Name of the conversation component.
daprConversationInputs List of prompts that are part of the conversation.
contextId Identifier for an existing chat session (e.g., similar to ChatGPT).
scrubPii Whether to scrub personally identifiable information (PII) from responses.
temperature Controls response randomness (lower = more predictable, higher = more creative).
Returns DaprConversationResponse

Models

The SDK follows the builder pattern for constructing models, ensuring cleaner and more maintainable object creation.


Tests

The testing strategy includes:

  • Unit Tests: Validate individual components and business logic.

Issue Reference

We ensure that all PRs are linked to a relevant issue where the problem or feature has been discussed before implementation.

This PR closes the following issue: #1101


Checklist ✅

Please confirm the following before merging:

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

@siri-varma siri-varma requested review from a team as code owners March 6, 2025 16:51
@siri-varma siri-varma force-pushed the users/svegiraju/conversation-api-2 branch from 68d30ee to 9a8926e Compare March 6, 2025 16:52
@siri-varma
Copy link
Contributor Author

siri-varma commented Mar 6, 2025

@salaboy, @artur-ciocanu please let me know what you think. Working on integration and unit tests in the meanwhile

@yaron2
Copy link
Member

yaron2 commented Mar 6, 2025

Great contribution, thanks @siri-varma

@cicoyle cicoyle added this to the v1.15 milestone Mar 6, 2025
@siri-varma siri-varma force-pushed the users/svegiraju/conversation-api-2 branch 2 times, most recently from 4cb6031 to 75f487f Compare March 6, 2025 19:11
@salaboy
Copy link
Contributor

salaboy commented Mar 6, 2025

this is great @siri-varma ! I will start reviewing soon!

@siri-varma siri-varma force-pushed the users/svegiraju/conversation-api-2 branch from bf70fd4 to 88fe015 Compare March 7, 2025 04:27
@siri-varma
Copy link
Contributor Author

siri-varma commented Mar 7, 2025

For integration tests, we must spin up a mock for third party LLM endpoint. Do we have similar patterns in the current setup? (where dapr is talking to a third party api and receiving responses)

@siri-varma siri-varma changed the title WIP: Add Conversation AI to Java SDK Add Conversation AI to Java SDK Mar 8, 2025
@salaboy salaboy mentioned this pull request Mar 10, 2025
@salaboy
Copy link
Contributor

salaboy commented Mar 13, 2025

@siri-varma this is looking good, I left some comments that basically highlight my doubts about some JDK general topics. But this is looking really good, are you planning to add integration tests inside the sdk-tests too? We have some Spring Boot tests using Testcontainers, I was thinking that you might want to test the APIs against a local model running in a docker container to see that everything works as expected.

@siri-varma
Copy link
Contributor Author

siri-varma commented Mar 14, 2025

@salaboy I have tested the code by running it locally and using my OpenAI API Key.

Regarding the integration test, I think we will need an LLM model for daprd to communicate with, which unfortunately are huge in size. That is why I did not add the integration tests

Will get back to you on the integ tests

@salaboy
Copy link
Contributor

salaboy commented Mar 14, 2025

Yeah check this https://java.testcontainers.org/modules/ollama/

@siri-varma
Copy link
Contributor Author

@salaboy thank you for providing the testcontainer urls.

Like how we have url overrides for Scheduler, I was looking one for conversation too because we will have to point dapr to the local llm model. But could not find any

I tried looking in the below places and could not find anything. https://github.com/dapr/dapr/blob/2e7c61e933099b9d40fcdefbd57cc3e81069915a/pkg/injector/annotations/annotations.go#L73
https://github.com/dapr/dapr/blob/2e7c61e933099b9d40fcdefbd57cc3e81069915a/pkg/injector/consts/consts.go#L51
https://docs.dapr.io/reference/arguments-annotations-overview/

@salaboy or @cicoyle Would you folks know about this ?

@artur-ciocanu
Copy link
Contributor

@siri-varma thanks a lot for your contribution. I have reviewed your PR and I have a few comments similar to #1255:

  • Let's make sure the Conversation API is part of the DaprPreviewClient
  • Let's make sure that we use the Alpha1 suffix for the Conversation API
  • Let's make sure we keep everything under sdk module and we don't create a separate module for Conversation API
  • For the Conversation API converse let's make sure we add private methods to validate all the input parameters, before invoking the GRPC API
  • For Conversation API converse method let's ensure we keep number of parameters to a minimum, having to pass 5 parameters is too much. I think a better option is to have a builder for ConversationRequest which should be part of the model classes for DaprClient. This way we can have sane defaults, but allow users to override some of the values if desired.

CC: @salaboy @cicoyle

Copy link
Contributor

@artur-ciocanu artur-ciocanu left a comment

Choose a reason for hiding this comment

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

@siri-varma thanks a lot for your contribution, I have left a longer comment with some of my thoughts.

Please take a look and let me know what you think.

@siri-varma siri-varma force-pushed the users/svegiraju/conversation-api-2 branch from 115b5e7 to 842b0e7 Compare March 18, 2025 15:10
@siri-varma
Copy link
Contributor Author

@siri-varma thanks a lot for your contribution. I have reviewed your PR and I have a few comments similar to #1255:

  • Let's make sure the Conversation API is part of the DaprPreviewClient
  • Let's make sure that we use the Alpha1 suffix for the Conversation API
  • Let's make sure we keep everything under sdk module and we don't create a separate module for Conversation API
  • For the Conversation API converse let's make sure we add private methods to validate all the input parameters, before invoking the GRPC API
  • For Conversation API converse method let's ensure we keep number of parameters to a minimum, having to pass 5 parameters is too much. I think a better option is to have a builder for ConversationRequest which should be part of the model classes for DaprClient. This way we can have sane defaults, but allow users to override some of the values if desired.

CC: @salaboy @cicoyle

@artur-ciocanu Addressed all the comments here as well.
@salaboy Added Integration tests too.

@siri-varma
Copy link
Contributor Author

@artur-ciocanu , @salaboy All the builds are passing and addressed comments as well. Would you folks be able to do another round of reviews please ?

Copy link
Contributor

@cicoyle cicoyle left a comment

Choose a reason for hiding this comment

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

Generally this looks great 🌟 - mind adding an example for conversation api to the examples directory in the repo with the mechanical markdown in the README with a sample .java file for users to know how to use the API?

We should also document the high level things that are expected when adding new APIs to the SDK to lower the barrier to entry for future developers and for consistency. Thanks for this PR 🚀 We are nearly there!

cicoyle
cicoyle previously approved these changes Apr 14, 2025
@siri-varma siri-varma force-pushed the users/svegiraju/conversation-api-2 branch 2 times, most recently from c6c36de to f467bd6 Compare April 22, 2025 14:19
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Map;

@Configuration
public class TestDaprJobsConfiguration {
public class DaprPreviewClientConfiguration {
Copy link
Contributor Author

Choose a reason for hiding this comment

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

The same daprPreviewClient is used across jobs and conversation. So converted the existing TestDaprJobs to a DaprPreviewClass and using it in both the places

@siri-varma
Copy link
Contributor Author

siri-varma commented Apr 22, 2025

@dapr-reviewers addressed all the comments

@cicoyle
Copy link
Contributor

cicoyle commented Apr 22, 2025

@dapr-reviewers addressed all the comments

I think you are looking for the following: @dapr/approvers-java-sdk @dapr/maintainers-java-sdk

If you type java- after the @ it should show you the right ones :)

siri-varma and others added 14 commits April 22, 2025 14:32
Signed-off-by: Siri Varma Vegiraju <[email protected]>
Signed-off-by: sirivarma <[email protected]>
Signed-off-by: siri-varma <[email protected]>
Signed-off-by: sirivarma <[email protected]>
Signed-off-by: siri-varma <[email protected]>
Signed-off-by: sirivarma <[email protected]>
Signed-off-by: siri-varma <[email protected]>
Signed-off-by: sirivarma <[email protected]>
Signed-off-by: siri-varma <[email protected]>
Signed-off-by: sirivarma <[email protected]>
Signed-off-by: siri-varma <[email protected]>
Signed-off-by: siri-varma <[email protected]>
…tionIT.java

Co-authored-by: Cassie Coyle <[email protected]>
Signed-off-by: Siri Varma Vegiraju <[email protected]>
Signed-off-by: siri-varma <[email protected]>
Signed-off-by: siri-varma <[email protected]>
Signed-off-by: siri-varma <[email protected]>
Signed-off-by: siri-varma <[email protected]>
Signed-off-by: siri-varma <[email protected]>
Signed-off-by: siri-varma <[email protected]>
Signed-off-by: siri-varma <[email protected]>
Signed-off-by: siri-varma <[email protected]>
@siri-varma
Copy link
Contributor Author

@dapr/approvers-java-sdk rebased the branch and ready for review

@siri-varma siri-varma force-pushed the users/svegiraju/conversation-api-2 branch from e5e51df to 9e23ce1 Compare April 22, 2025 21:35
Copy link

codecov bot commented Apr 23, 2025

Codecov Report

Attention: Patch coverage is 94.80519% with 4 lines in your changes missing coverage. Please review.

Project coverage is 77.42%. Comparing base (d759c53) to head (6e303fa).
Report is 133 commits behind head on master.

Files with missing lines Patch % Lines
...k/src/main/java/io/dapr/client/DaprClientImpl.java 92.50% 2 Missing and 1 partial ⚠️
...java/io/dapr/client/domain/ConversationOutput.java 83.33% 1 Missing ⚠️
Additional details and impacted files
@@             Coverage Diff              @@
##             master    #1235      +/-   ##
============================================
+ Coverage     76.91%   77.42%   +0.51%     
- Complexity     1592     1762     +170     
============================================
  Files           145      204      +59     
  Lines          4843     5360     +517     
  Branches        562      584      +22     
============================================
+ Hits           3725     4150     +425     
- Misses          821      898      +77     
- Partials        297      312      +15     

☔ View full report in Codecov by Sentry.
📢 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.

Signed-off-by: siri-varma <[email protected]>
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.

5 participants