-
Notifications
You must be signed in to change notification settings - Fork 215
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
base: master
Are you sure you want to change the base?
Add Conversation AI to Java SDK #1235
Conversation
68d30ee
to
9a8926e
Compare
@salaboy, @artur-ciocanu please let me know what you think. Working on integration and unit tests in the meanwhile |
Great contribution, thanks @siri-varma |
9a8926e
to
4cb6031
Compare
Signed-off-by: Siri Varma Vegiraju <[email protected]> Signed-off-by: sirivarma <[email protected]>
4cb6031
to
75f487f
Compare
this is great @siri-varma ! I will start reviewing soon! |
Signed-off-by: sirivarma <[email protected]>
bf70fd4
to
88fe015
Compare
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) |
import java.util.Map; | ||
import java.util.function.Consumer; | ||
|
||
public class DaprConversationClient implements AutoCloseable, DaprAiClient { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@siri-varma I assume that you know that we had a previewClient, why is this introducing a new separated client for the conversation API? I would assume that we want to include this in PreviewClient first. @yaron2 we might need your help here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
and sorry for the confusion if the PreviewClient is an old thing that we are not supposed to use anymore. As the workflows now have their own separate client, this might be the way to go.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just to clarify, we are fine with current approach right ?
@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 |
@salaboy I have tested the code by running it locally and using my OpenAI API Key.
Will get back to you on the integ tests |
Signed-off-by: sirivarma <[email protected]>
…om/siri-varma/java-sdk into users/svegiraju/conversation-api-2
Yeah check this https://java.testcontainers.org/modules/ollama/ |
@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 |
@siri-varma thanks a lot for your contribution. I have reviewed your PR and I have a few comments similar to #1255:
|
There was a problem hiding this 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.
Signed-off-by: sirivarma <[email protected]>
115b5e7
to
842b0e7
Compare
Signed-off-by: sirivarma <[email protected]>
Signed-off-by: siri-varma <[email protected]>
@artur-ciocanu Addressed all the comments here as well. |
@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 ? |
There was a problem hiding this 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!
examples/src/main/java/io/dapr/examples/conversation/DemoConversationAI.java
Show resolved
Hide resolved
sdk-tests/src/test/java/io/dapr/it/testcontainers/DaprConversationIT.java
Outdated
Show resolved
Hide resolved
…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]>
Amazing work here @siri-varma 🚀 Thanks for the contribution 🌟 |
Signed-off-by: artur-ciocanu <[email protected]>
There was a problem hiding this 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 all your hard work! I have a few general comments that are critical, others are mostly style related:
- Dapr Conversation API uses a component to configure everything related to model interaction and we should make sure that this is reflected in the API like using
name
orcomponentName
. I feelcomponentName
makes more sense, but I will let @cicoyle and @salaboy share their thoughts. scrubPII
- I know this comes from Dapr Runtime, but honestly it looks and feels cryptic, so if we can agree on a better name and then propagate this back to Dapr Runtime that would be great.ConversationRole
- any LLM framework I have used, do not constraint the role in any way, since you can have different roles, depending on use case, so I think sticking to Dapr Runtime string is good enough.
Please take a look and let me know your thoughts.
throw new RuntimeException(e); | ||
} | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Add new line
+ "This is the my number 672-123-4567"); | ||
|
||
// Component name is the name provided in the metadata block of the conversation.yaml file. | ||
Mono<ConversationResponse> responseMono = client.converse(new ConversationRequest("echo", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You could use a more modern approach from Java 11 List.of(...)
instead of Collections.singleton(...)
@@ -0,0 +1,117 @@ | |||
## Manage Dapr Jobs via the Conversation API |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Manage Dapr Jobs
looks confusing ... is this related to Job API
or Conversation API
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
good catch, lets remove jobs from this unless you are using the jobs api
.
@@ -17,7 +17,7 @@ | |||
<grpc.version>1.69.0</grpc.version> | |||
<protobuf.version>3.25.5</protobuf.version> | |||
<protocCommand>protoc</protocCommand> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should be updated to latest
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
v1.15.4
is latest as of now - think this was just bc the PR has been open a while and we more recently released 1.15.3 && 1.15.4
Assertions.assertEquals("input this <PHONE_NUMBER>", | ||
response.getConversationOutpus().get(1).getResult()); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Add new line
observer.onCompleted(); | ||
return null; | ||
}).when(daprStub).converseAlpha1(any(DaprProtos.ConversationRequest.class), any()); | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could we rename it to daprConversationInput
|
||
List<ConversationInput> daprConversationInputs = new ArrayList<>(); | ||
daprConversationInputs.add(daprConversationInput); | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could we rename it to response
verify(daprStub, times(1)).converseAlpha1(captor.capture(), Mockito.any()); | ||
|
||
DaprProtos.ConversationRequest conversationRequest = captor.getValue(); | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could we use static imports so we could use just assertEquals
without Assertions
.setContent(input.getContent()) | ||
.setScrubPII(input.isScrubPii()); | ||
|
||
if (input.getRole() != null) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ConversationRole
is an enum with TOOL, USER, ASSISTANT and toString()
would return capital case "TOOL", "USER", "ASSISTANT". While I think enum is a good idea, I would keep it compatible with GRPC object and use an ordinary string. We want users to decide what role they want to use system
, assistant
, agent
, etc
|
||
/** | ||
* Conversation AI supported roles. | ||
*/ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As I mentioned I am not sure we need this enum. We want user to use whatever they feel is appropriate as a role. We don't want to keep changing this enum, because someone has a different use case.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I replied on the other thread - I agree, lets align and use string. I appreciate the enum idea here though 🙏🏻
Codecov ReportAttention: Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## master #1235 +/- ##
============================================
- Coverage 76.91% 75.69% -1.23%
- Complexity 1592 1641 +49
============================================
Files 145 199 +54
Lines 4843 5171 +328
Branches 562 567 +5
============================================
+ Hits 3725 3914 +189
- Misses 821 936 +115
- Partials 297 321 +24 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
I understand where you are coming from, however we want to align with dapr runtime and other sdks. For example, the Same for component name - dotnet && go-sdk for example For |
will update this pr in couple of days |
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
The core logic is implemented in a key class, as detailed below:
- 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.
conversationComponentName
daprConversationInputs
contextId
scrubPii
temperature
DaprConversationResponse
Models
The SDK follows the builder pattern for constructing models, ensuring cleaner and more maintainable object creation.
Tests
The testing strategy includes:
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: