-
Notifications
You must be signed in to change notification settings - Fork 15
feat: [Orchestration] Support for Orchestration config persistence #697
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: main
Are you sure you want to change the base?
Conversation
# Conflicts: # docs/release_notes.md
| if (!prompt.getMessages().isEmpty()) { | ||
| log.debug( | ||
| "Messages in prompts are ignored when using Orchestration configs via reference. Change the Orchestration config instead."); | ||
| } |
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 could also throw instead of just logging. Was not sure which is better.
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.
Can you give a code sample that triggers this warning?
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.
Will be triggered e.g. by
var reference = OrchestrationConfigReference.fromId("test-id");
var prompt = new OrchestrationPrompt("Your message here.");
var response = client.executeRequestFromReference(prompt, reference);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.
warn would be better, debug is disabled most of the time.
Example: we use <root level="INFO"/> for our dependencies.
| public OrchestrationChatResponse executeRequestFromReference( | ||
| @Nullable final OrchestrationPrompt prompt, | ||
| @Nonnull final OrchestrationConfigReference reference) { |
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.
We could add
public OrchestrationChatResponse executeRequestFromReference(
@Nonnull final OrchestrationConfigReference reference) {...}as well for even more convenience? (The prompt is used to forward placeholder values and the message history, so it is not always needed but probably in most actual use cases).
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'm not a fan of either method option. Also not liking existing executeRequest siblings.
To me this method looks similar to "normal" use-case
public OrchestrationChatResponse chatCompletion(
@Nonnull final OrchestrationPrompt prompt, @Nonnull final OrchestrationModuleConfig config)
As a user i would assume methods have similar signature whether they use an explicit orchestration config, or an implicit config.
Or is the semantic usage different (enough) to justify a different name schema?
| @Value | ||
| @AllArgsConstructor(access = AccessLevel.PRIVATE) | ||
| @Beta | ||
| public class OrchestrationConfigReference { |
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 decided against making this a sealed interface plus two permitted classes because I felt that would be a bit of an overkill for such little logic. Would be interested in your thoughts about that.
| * | ||
| * @since 1.14.0 | ||
| */ | ||
| public class OrchestrationConfigClient extends OrchestrationConfigsApi { |
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.
(Major/Discussion)
I don't think we want to extend a custom class from generated code. Did we do that before? Is there no other way to apply mixins? Otherwise this has a code smell; we're introducing hand-written public API code for the sake of a workaround.
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.
We did that in PromptClient and GroundingClient. It's only to add mix-ins.
| */ | ||
| @Nonnull | ||
| public static Builder fromScenario(@Nonnull final String scenario) { | ||
| return new Builder(scenario); |
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.
(Minor)
You could've turned this into a currying builder, when the classes were interfaces.
return (name) -> (version) -> new OrchestrationConfigReference(null, scenario, name, version);
| @Value | ||
| @AllArgsConstructor(access = AccessLevel.PRIVATE) | ||
| @Beta | ||
| public class OrchestrationConfigReference { |
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.
(Minor)
We could reduce future maintenance if the getters were package scoped(?)
CharlesDuboisSAP
left a comment
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.
Looking good 😎
| private void ensureOrchestrationConfigExists() { | ||
| final OrchestrationConfigClient orchConfigClient = new OrchestrationConfigClient(); | ||
| if (!orchConfigExists("test-config-for-OrchestrationTest", orchConfigClient)) { | ||
| final OrchestrationConfigPostRequest postRequest = | ||
| OrchestrationConfigPostRequest.create() | ||
| .name("test-config-for-OrchestrationTest") | ||
| .version("0.0.1") | ||
| .scenario("sdk-test-scenario") |
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.
| private void ensureOrchestrationConfigExists() { | |
| final OrchestrationConfigClient orchConfigClient = new OrchestrationConfigClient(); | |
| if (!orchConfigExists("test-config-for-OrchestrationTest", orchConfigClient)) { | |
| final OrchestrationConfigPostRequest postRequest = | |
| OrchestrationConfigPostRequest.create() | |
| .name("test-config-for-OrchestrationTest") | |
| .version("0.0.1") | |
| .scenario("sdk-test-scenario") | |
| private void ensureOrchestrationConfigExists(final String scenario, final String name) { | |
| final OrchestrationConfigClient orchConfigClient = new OrchestrationConfigClient(); | |
| if (!orchConfigExists("test-config-for-OrchestrationTest", orchConfigClient)) { | |
| final OrchestrationConfigPostRequest postRequest = | |
| OrchestrationConfigPostRequest.create() | |
| .name(name) | |
| .version("0.0.1") | |
| .scenario(scenario) |
| ensureOrchestrationConfigExists(); | ||
| final var testReference = | ||
| OrchestrationConfigReference.fromScenario("sdk-test-scenario") | ||
| .name("test-config-for-OrchestrationTest") | ||
| .version("0.0.1"); | ||
| final List<Message> history = List.of(new SystemMessage("Start every sentence with an emoji.")); | ||
| final OrchestrationPrompt testPrompt = | ||
| new OrchestrationPrompt(Map.of("phrase", "Hello World")).messageHistory(history); | ||
| return client.executeRequestFromReference(testPrompt, testReference); |
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.
| ensureOrchestrationConfigExists(); | |
| final var testReference = | |
| OrchestrationConfigReference.fromScenario("sdk-test-scenario") | |
| .name("test-config-for-OrchestrationTest") | |
| .version("0.0.1"); | |
| final List<Message> history = List.of(new SystemMessage("Start every sentence with an emoji.")); | |
| final OrchestrationPrompt testPrompt = | |
| new OrchestrationPrompt(Map.of("phrase", "Hello World")).messageHistory(history); | |
| return client.executeRequestFromReference(testPrompt, testReference); | |
| // Could also be enums that are reused in PromptRegistryController | |
| val scenario = "sdk-test-paraphrase"; | |
| val name = "create-3-paraphrases-of-sentence"; | |
| ensureOrchestrationConfigExists(scenario, name); | |
| final var configReference = | |
| OrchestrationConfigReference.fromScenario(scenario) | |
| .name(name) | |
| .version("0.0.1"); | |
| final List<Message> history = List.of(new SystemMessage("Start every sentence with an emoji.")); | |
| final OrchestrationPrompt prompt = | |
| new OrchestrationPrompt(Map.of("phrase", "Hello World")).messageHistory(history); | |
| return client.executeRequestFromReference(prompt, configReference); |
The current names make it hard to understand what is happening.
|
|
||
| - [Orchestration] Added new models for `OrchestrationAiModel`: `SAP_ABAP_1`, `SONAR`,`SONAR_PRO`, `GEMINI_2_5_FLASH_LITE`, `CLAUDE_4_5_HAIKU`, `GPT_REALTIME`. | ||
| - [Orchestration] Added new models for `OrchestrationAiModel`: `SAP_ABAP_1`, `SONAR`,`SONAR_PRO`, `GEMINI_2_5_FLASH_LITE`, `CLAUDE_4_5_HAIKU`, `GPT_REALTIME`, `COHERE_COMMAND_A_REASONING`, `NOVA_PREMIER`, `COHERE_RERANKER`. | ||
| - [Orchestration] Configs stored in prompt registry can now be used for Orchestration calls via reference. |
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.
| - [Orchestration] Configs stored in prompt registry can now be used for Orchestration calls via reference. | |
| - [Orchestration] Configs stored in prompt registry can now be used for Orchestration calls via reference `OrchestrationClient.executeRequestFromReference()`. |
Either the added function or a link to the docs would be nice.
| - [Orchestration] Convenience for adding the `metadata_params` option to grounding calls. | ||
| - [Orchestration] Added new models for `OrchestrationAiModel`: `COHERE_COMMAND_A_REASONING`, `NOVA_PREMIER`, `COHERE_RERANKER`. | ||
| - [Orchestration] Deprecated `DEEPSEEK_R1` model from `OrchestrationAiModel` with no replacement. | ||
| - [Prompt Registry] Added support to manage Orchestration configs stored in Prompt Registry. |
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.
| - [Prompt Registry] Added support to manage Orchestration configs stored in Prompt Registry. | |
| - [Prompt Registry] Added support to manage Orchestration configs stored in Prompt Registry `OrchestrationConfigClient`. |
Either the added class or a link to the docs would be nice.
| if (!prompt.getMessages().isEmpty()) { | ||
| log.debug( | ||
| "Messages in prompts are ignored when using Orchestration configs via reference. Change the Orchestration config instead."); | ||
| } |
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.
Can you give a code sample that triggers this warning?
| "Create {{?number}} paraphrases of {{?phrase}}")) | ||
| .role(UserChatMessage.RoleEnum.USER)) | ||
| .defaults(Map.of("number", "3"))) | ||
| .model(LLMModelDetails.create().name("gpt-4.1-nano"))))); |
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.
| .model(LLMModelDetails.create().name("gpt-4.1-nano"))))); | |
| .model(LLMModelDetails.create().name(GPT_41_NANO.getName()))))); |
Context
The PR enables the management of Orchestration Configs in prompt registry (create, delete, list via generated code and new client) as well as convenience to use these Orchestration Configs in the
OrchestrationClient.Sample of new convenience:
Feature scope:
OchestrationConfigClientin prompt registryOrchestrationClientDefinition of Done
Aligned changes with the JavaScript SDK