From 1fef551a65270cf7d44451199a706377e0ef8efe Mon Sep 17 00:00:00 2001 From: Samantha Coyle Date: Tue, 3 Feb 2026 09:27:28 -0600 Subject: [PATCH 1/4] feat(convo): add new fields to conversation api Signed-off-by: Samantha Coyle --- dapr/clients/grpc/client.py | 10 ++ dapr/clients/grpc/conversation.py | 70 +++++++++++++- tests/clients/fake_dapr_server.py | 14 +++ tests/clients/test_conversation.py | 145 +++++++++++++++++++++++++++++ 4 files changed, 238 insertions(+), 1 deletion(-) diff --git a/dapr/clients/grpc/client.py b/dapr/clients/grpc/client.py index ccf0ed721..faf356491 100644 --- a/dapr/clients/grpc/client.py +++ b/dapr/clients/grpc/client.py @@ -25,8 +25,10 @@ import grpc # type: ignore from google.protobuf.any_pb2 import Any as GrpcAny +from google.protobuf.duration_pb2 import Duration as GrpcDuration from google.protobuf.empty_pb2 import Empty as GrpcEmpty from google.protobuf.message import Message as GrpcMessage +from google.protobuf.struct_pb2 import Struct as GrpcStruct from grpc import ( # type: ignore RpcError, StreamStreamClientInterceptor, @@ -1787,6 +1789,8 @@ def converse_alpha2( temperature: Optional[float] = None, tools: Optional[List[conversation.ConversationTools]] = None, tool_choice: Optional[str] = None, + response_format: Optional[GrpcStruct] = None, + prompt_cache_retention: Optional[GrpcDuration] = None, ) -> conversation.ConversationResponseAlpha2: """Invoke an LLM using the conversation API (Alpha2) with tool calling support. @@ -1800,6 +1804,8 @@ def converse_alpha2( temperature: Optional temperature setting for the LLM to optimize for creativity or predictability tools: Optional list of tools available for the LLM to call tool_choice: Optional control over which tools can be called ('none', 'auto', 'required', or specific tool name) + response_format: Optional response format (google.protobuf.struct_pb2.Struct, ex: json_schema for structured output) + prompt_cache_retention: Optional retention for prompt cache (google.protobuf.duration_pb2.Duration) Returns: ConversationResponseAlpha2 containing the conversation results with choices and tool calls @@ -1856,6 +1862,10 @@ def converse_alpha2( request.temperature = temperature if tool_choice is not None: request.tool_choice = tool_choice + if response_format is not None and hasattr(request, 'response_format'): + request.response_format.CopyFrom(response_format) + if prompt_cache_retention is not None and hasattr(request, 'prompt_cache_retention'): + request.prompt_cache_retention.CopyFrom(prompt_cache_retention) try: response, call = self.retry_policy.run_rpc(self._stub.ConverseAlpha2.with_call, request) diff --git a/dapr/clients/grpc/conversation.py b/dapr/clients/grpc/conversation.py index d11c41979..bfd314f0e 100644 --- a/dapr/clients/grpc/conversation.py +++ b/dapr/clients/grpc/conversation.py @@ -338,11 +338,46 @@ class ConversationResultAlpha2Choices: message: ConversationResultAlpha2Message +@dataclass +class ConversationResultAlpha2CompletionUsageCompletionTokensDetails: + """Breakdown of tokens used in the completion.""" + + accepted_prediction_tokens: int = 0 + audio_tokens: int = 0 + reasoning_tokens: int = 0 + rejected_prediction_tokens: int = 0 + + +@dataclass +class ConversationResultAlpha2CompletionUsagePromptTokensDetails: + """Breakdown of tokens used in the prompt.""" + + audio_tokens: int = 0 + cached_tokens: int = 0 + + +@dataclass +class ConversationResultAlpha2CompletionUsage: + """Token usage for one Alpha2 conversation result.""" + + completion_tokens: int = 0 + prompt_tokens: int = 0 + total_tokens: int = 0 + completion_tokens_details: Optional[ + ConversationResultAlpha2CompletionUsageCompletionTokensDetails + ] = None + prompt_tokens_details: Optional[ConversationResultAlpha2CompletionUsagePromptTokensDetails] = ( + None + ) + + @dataclass class ConversationResultAlpha2: """One of the outputs in Alpha2 response from conversation input.""" choices: List[ConversationResultAlpha2Choices] = field(default_factory=list) + model: Optional[str] = None + usage: Optional[ConversationResultAlpha2CompletionUsage] = None @dataclass @@ -657,5 +692,38 @@ def _get_outputs_from_grpc_response( ) ) - outputs.append(ConversationResultAlpha2(choices=choices)) + model: Optional[str] = None + usage: Optional[ConversationResultAlpha2CompletionUsage] = None + if hasattr(output, 'model') and getattr(output, 'model', ''): + model = output.model + if hasattr(output, 'usage') and output.usage: + u = output.usage + completion_details: Optional[ + ConversationResultAlpha2CompletionUsageCompletionTokensDetails + ] = None + prompt_details: Optional[ConversationResultAlpha2CompletionUsagePromptTokensDetails] = ( + None + ) + if hasattr(u, 'completion_tokens_details') and u.completion_tokens_details: + cd = u.completion_tokens_details + completion_details = ConversationResultAlpha2CompletionUsageCompletionTokensDetails( + accepted_prediction_tokens=getattr(cd, 'accepted_prediction_tokens', 0) or 0, + audio_tokens=getattr(cd, 'audio_tokens', 0) or 0, + reasoning_tokens=getattr(cd, 'reasoning_tokens', 0) or 0, + rejected_prediction_tokens=getattr(cd, 'rejected_prediction_tokens', 0) or 0, + ) + if hasattr(u, 'prompt_tokens_details') and u.prompt_tokens_details: + pd = u.prompt_tokens_details + prompt_details = ConversationResultAlpha2CompletionUsagePromptTokensDetails( + audio_tokens=getattr(pd, 'audio_tokens', 0) or 0, + cached_tokens=getattr(pd, 'cached_tokens', 0) or 0, + ) + usage = ConversationResultAlpha2CompletionUsage( + completion_tokens=getattr(u, 'completion_tokens', 0) or 0, + prompt_tokens=getattr(u, 'prompt_tokens', 0) or 0, + total_tokens=getattr(u, 'total_tokens', 0) or 0, + completion_tokens_details=completion_details, + prompt_tokens_details=prompt_details, + ) + outputs.append(ConversationResultAlpha2(choices=choices, model=model, usage=usage)) return outputs diff --git a/tests/clients/fake_dapr_server.py b/tests/clients/fake_dapr_server.py index 73cd22fd9..742b96763 100644 --- a/tests/clients/fake_dapr_server.py +++ b/tests/clients/fake_dapr_server.py @@ -582,6 +582,20 @@ def ConverseAlpha2(self, request, context): # Create result for this input result = api_v1.ConversationResultAlpha2(choices=choices) + if hasattr(result, 'model'): + result.model = 'test-llm' + if hasattr(result, 'usage'): + try: + usage_cls = getattr(api_v1, 'ConversationResultAlpha2CompletionUsage', None) + if usage_cls is not None: + u = usage_cls( + completion_tokens=10, + prompt_tokens=5, + total_tokens=15, + ) + result.usage.CopyFrom(u) + except Exception: + pass outputs.append(result) return api_v1.ConversationResponseAlpha2( diff --git a/tests/clients/test_conversation.py b/tests/clients/test_conversation.py index 50daebc64..0aae98b4f 100644 --- a/tests/clients/test_conversation.py +++ b/tests/clients/test_conversation.py @@ -37,12 +37,16 @@ ConversationResponseAlpha2, ConversationResultAlpha2, ConversationResultAlpha2Choices, + ConversationResultAlpha2CompletionUsage, + ConversationResultAlpha2CompletionUsageCompletionTokensDetails, + ConversationResultAlpha2CompletionUsagePromptTokensDetails, ConversationResultAlpha2Message, ConversationToolCalls, ConversationToolCallsOfFunction, ConversationTools, ConversationToolsFunction, FunctionBackend, + _get_outputs_from_grpc_response, create_assistant_message, create_system_message, create_tool_message, @@ -248,6 +252,14 @@ def test_basic_conversation_alpha2(self): self.assertEqual(choice.finish_reason, 'stop') self.assertIn('Hello Alpha2!', choice.message.content) + out = response.outputs[0] + if out.model is not None: + self.assertEqual(out.model, 'test-llm') + if out.usage is not None: + self.assertGreaterEqual(out.usage.total_tokens, 15) + self.assertGreaterEqual(out.usage.prompt_tokens, 5) + self.assertGreaterEqual(out.usage.completion_tokens, 10) + def test_conversation_alpha2_with_system_message(self): """Test Alpha2 conversation with system message.""" system_message = create_system_message('You are a helpful assistant.') @@ -1107,6 +1119,139 @@ def test_empty_and_none_outputs(self): self.assertEqual(response_none.to_assistant_messages(), []) +class TestConversationResultAlpha2ModelAndUsage(unittest.TestCase): + """Tests for model and usage fields on ConversationResultAlpha2 and related types.""" + + def test_result_alpha2_has_model_and_usage_attributes(self): + """ConversationResultAlpha2 accepts and exposes model and usage.""" + msg = ConversationResultAlpha2Message(content='Hi', tool_calls=[]) + choice = ConversationResultAlpha2Choices(finish_reason='stop', index=0, message=msg) + usage = ConversationResultAlpha2CompletionUsage( + completion_tokens=10, + prompt_tokens=5, + total_tokens=15, + ) + result = ConversationResultAlpha2( + choices=[choice], + model='test-model-1', + usage=usage, + ) + self.assertEqual(result.model, 'test-model-1') + self.assertIsNotNone(result.usage) + self.assertEqual(result.usage.completion_tokens, 10) + self.assertEqual(result.usage.prompt_tokens, 5) + self.assertEqual(result.usage.total_tokens, 15) + + def test_result_alpha2_model_and_usage_default_none(self): + """ConversationResultAlpha2 optional fields default to None when not provided. + + When the API returns a response, model and usage are set from the conversation + component. This test only checks that the dataclass defaults are None when + constructing with choices only. + """ + msg = ConversationResultAlpha2Message(content='Hi', tool_calls=[]) + choice = ConversationResultAlpha2Choices(finish_reason='stop', index=0, message=msg) + result = ConversationResultAlpha2(choices=[choice]) + self.assertIsNone(result.model) + self.assertIsNone(result.usage) + + def test_usage_completion_and_prompt_details(self): + """ConversationResultAlpha2CompletionUsage supports details.""" + completion_details = ConversationResultAlpha2CompletionUsageCompletionTokensDetails( + accepted_prediction_tokens=1, + audio_tokens=2, + reasoning_tokens=3, + rejected_prediction_tokens=0, + ) + prompt_details = ConversationResultAlpha2CompletionUsagePromptTokensDetails( + audio_tokens=0, + cached_tokens=4, + ) + usage = ConversationResultAlpha2CompletionUsage( + completion_tokens=10, + prompt_tokens=5, + total_tokens=15, + completion_tokens_details=completion_details, + prompt_tokens_details=prompt_details, + ) + self.assertEqual(usage.completion_tokens_details.accepted_prediction_tokens, 1) + self.assertEqual(usage.completion_tokens_details.audio_tokens, 2) + self.assertEqual(usage.completion_tokens_details.reasoning_tokens, 3) + self.assertEqual(usage.completion_tokens_details.rejected_prediction_tokens, 0) + self.assertEqual(usage.prompt_tokens_details.audio_tokens, 0) + self.assertEqual(usage.prompt_tokens_details.cached_tokens, 4) + self.assertEqual(usage.total_tokens, 15) + self.assertEqual(usage.completion_tokens, 10) + self.assertEqual(usage.prompt_tokens, 5) + + def test_get_outputs_from_grpc_response_populates_model_and_usage(self): + """_get_outputs_from_grpc_response sets model and usage when present on proto.""" + from unittest import mock + + # Build a mock proto response with one output that has model and usage + mock_usage = mock.Mock() + mock_usage.completion_tokens = 20 + mock_usage.prompt_tokens = 8 + mock_usage.total_tokens = 28 + mock_usage.completion_tokens_details = None + mock_usage.prompt_tokens_details = None + + mock_choice_msg = mock.Mock() + mock_choice_msg.content = 'Hello' + mock_choice_msg.tool_calls = [] + + mock_choice = mock.Mock() + mock_choice.finish_reason = 'stop' + mock_choice.index = 0 + mock_choice.message = mock_choice_msg + + mock_output = mock.Mock() + mock_output.model = 'gpt-4o-mini' + mock_output.usage = mock_usage + mock_output.choices = [mock_choice] + + mock_response = mock.Mock() + mock_response.outputs = [mock_output] + + outputs = _get_outputs_from_grpc_response(mock_response) + self.assertEqual(len(outputs), 1) + out = outputs[0] + self.assertEqual(out.model, 'gpt-4o-mini') + self.assertIsNotNone(out.usage) + self.assertEqual(out.usage.completion_tokens, 20) + self.assertEqual(out.usage.prompt_tokens, 8) + self.assertEqual(out.usage.total_tokens, 28) + self.assertEqual(len(out.choices), 1) + self.assertEqual(out.choices[0].message.content, 'Hello') + + def test_get_outputs_from_grpc_response_without_model_usage(self): + """_get_outputs_from_grpc_response leaves model and usage None when absent.""" + from unittest import mock + + mock_choice_msg = mock.Mock() + mock_choice_msg.content = 'Echo' + mock_choice_msg.tool_calls = [] + + mock_choice = mock.Mock() + mock_choice.finish_reason = 'stop' + mock_choice.index = 0 + mock_choice.message = mock_choice_msg + + mock_output = mock.Mock(spec=['choices']) + mock_output.choices = [mock_choice] + # No model or usage attributes + + mock_response = mock.Mock() + mock_response.outputs = [mock_output] + + outputs = _get_outputs_from_grpc_response(mock_response) + self.assertEqual(len(outputs), 1) + out = outputs[0] + self.assertIsNone(out.model) + self.assertIsNone(out.usage) + self.assertEqual(out.choices[0].message.content, 'Echo') + + class ExecuteRegisteredToolSyncTests(unittest.TestCase): def tearDown(self): # Cleanup all tools we may have registered by name prefix From 65aaca9cbfa322b651ee3b83c88a740dc1b44935 Mon Sep 17 00:00:00 2001 From: Samantha Coyle Date: Tue, 3 Feb 2026 09:43:26 -0600 Subject: [PATCH 2/4] fix: update proto/grpc code generator and add more tests Signed-off-by: Samantha Coyle --- dapr/proto/runtime/v1/ai_pb2.py | 113 +++++---- dapr/proto/runtime/v1/ai_pb2.pyi | 228 ++++++++++++++++-- dapr/proto/runtime/v1/appcallback_pb2.py | 14 +- dapr/proto/runtime/v1/appcallback_pb2_grpc.py | 44 ++++ dapr/proto/runtime/v1/dapr_pb2.py | 6 +- dapr/proto/runtime/v1/dapr_pb2_grpc.py | 44 ++++ tests/clients/test_conversation.py | 47 ++++ 7 files changed, 417 insertions(+), 79 deletions(-) diff --git a/dapr/proto/runtime/v1/ai_pb2.py b/dapr/proto/runtime/v1/ai_pb2.py index 0f56cd0d9..574eb7a4e 100644 --- a/dapr/proto/runtime/v1/ai_pb2.py +++ b/dapr/proto/runtime/v1/ai_pb2.py @@ -24,9 +24,10 @@ from google.protobuf import any_pb2 as google_dot_protobuf_dot_any__pb2 from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2 +from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1e\x64\x61pr/proto/runtime/v1/ai.proto\x12\x15\x64\x61pr.proto.runtime.v1\x1a\x19google/protobuf/any.proto\x1a\x1cgoogle/protobuf/struct.proto\"\xeb\x03\n\x13\x43onversationRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x16\n\tcontextID\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x38\n\x06inputs\x18\x03 \x03(\x0b\x32(.dapr.proto.runtime.v1.ConversationInput\x12N\n\nparameters\x18\x04 \x03(\x0b\x32:.dapr.proto.runtime.v1.ConversationRequest.ParametersEntry\x12J\n\x08metadata\x18\x05 \x03(\x0b\x32\x38.dapr.proto.runtime.v1.ConversationRequest.MetadataEntry\x12\x15\n\x08scrubPII\x18\x06 \x01(\x08H\x01\x88\x01\x01\x12\x18\n\x0btemperature\x18\x07 \x01(\x01H\x02\x88\x01\x01\x1aG\n\x0fParametersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12#\n\x05value\x18\x02 \x01(\x0b\x32\x14.google.protobuf.Any:\x02\x38\x01\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01:\x02\x18\x01\x42\x0c\n\n_contextIDB\x0b\n\t_scrubPIIB\x0e\n\x0c_temperature\"\xe6\x04\n\x19\x43onversationRequestAlpha2\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x17\n\ncontext_id\x18\x02 \x01(\tH\x00\x88\x01\x01\x12>\n\x06inputs\x18\x03 \x03(\x0b\x32..dapr.proto.runtime.v1.ConversationInputAlpha2\x12T\n\nparameters\x18\x04 \x03(\x0b\x32@.dapr.proto.runtime.v1.ConversationRequestAlpha2.ParametersEntry\x12P\n\x08metadata\x18\x05 \x03(\x0b\x32>.dapr.proto.runtime.v1.ConversationRequestAlpha2.MetadataEntry\x12\x16\n\tscrub_pii\x18\x06 \x01(\x08H\x01\x88\x01\x01\x12\x18\n\x0btemperature\x18\x07 \x01(\x01H\x02\x88\x01\x01\x12\x37\n\x05tools\x18\x08 \x03(\x0b\x32(.dapr.proto.runtime.v1.ConversationTools\x12\x18\n\x0btool_choice\x18\t \x01(\tH\x03\x88\x01\x01\x1aG\n\x0fParametersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12#\n\x05value\x18\x02 \x01(\x0b\x32\x14.google.protobuf.Any:\x02\x38\x01\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\r\n\x0b_context_idB\x0c\n\n_scrub_piiB\x0e\n\x0c_temperatureB\x0e\n\x0c_tool_choice\"h\n\x11\x43onversationInput\x12\x0f\n\x07\x63ontent\x18\x01 \x01(\t\x12\x11\n\x04role\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x15\n\x08scrubPII\x18\x03 \x01(\x08H\x01\x88\x01\x01:\x02\x18\x01\x42\x07\n\x05_roleB\x0b\n\t_scrubPII\"}\n\x17\x43onversationInputAlpha2\x12<\n\x08messages\x18\x01 \x03(\x0b\x32*.dapr.proto.runtime.v1.ConversationMessage\x12\x16\n\tscrub_pii\x18\x02 \x01(\x08H\x00\x88\x01\x01\x42\x0c\n\n_scrub_pii\"\x97\x03\n\x13\x43onversationMessage\x12M\n\x0cof_developer\x18\x01 \x01(\x0b\x32\x35.dapr.proto.runtime.v1.ConversationMessageOfDeveloperH\x00\x12G\n\tof_system\x18\x02 \x01(\x0b\x32\x32.dapr.proto.runtime.v1.ConversationMessageOfSystemH\x00\x12\x43\n\x07of_user\x18\x03 \x01(\x0b\x32\x30.dapr.proto.runtime.v1.ConversationMessageOfUserH\x00\x12M\n\x0cof_assistant\x18\x04 \x01(\x0b\x32\x35.dapr.proto.runtime.v1.ConversationMessageOfAssistantH\x00\x12\x43\n\x07of_tool\x18\x05 \x01(\x0b\x32\x30.dapr.proto.runtime.v1.ConversationMessageOfToolH\x00\x42\x0f\n\rmessage_types\"\x80\x01\n\x1e\x43onversationMessageOfDeveloper\x12\x11\n\x04name\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x42\n\x07\x63ontent\x18\x02 \x03(\x0b\x32\x31.dapr.proto.runtime.v1.ConversationMessageContentB\x07\n\x05_name\"}\n\x1b\x43onversationMessageOfSystem\x12\x11\n\x04name\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x42\n\x07\x63ontent\x18\x02 \x03(\x0b\x32\x31.dapr.proto.runtime.v1.ConversationMessageContentB\x07\n\x05_name\"{\n\x19\x43onversationMessageOfUser\x12\x11\n\x04name\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x42\n\x07\x63ontent\x18\x02 \x03(\x0b\x32\x31.dapr.proto.runtime.v1.ConversationMessageContentB\x07\n\x05_name\"\xc2\x01\n\x1e\x43onversationMessageOfAssistant\x12\x11\n\x04name\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x42\n\x07\x63ontent\x18\x02 \x03(\x0b\x32\x31.dapr.proto.runtime.v1.ConversationMessageContent\x12@\n\ntool_calls\x18\x03 \x03(\x0b\x32,.dapr.proto.runtime.v1.ConversationToolCallsB\x07\n\x05_name\"\x8f\x01\n\x19\x43onversationMessageOfTool\x12\x14\n\x07tool_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x42\n\x07\x63ontent\x18\x03 \x03(\x0b\x32\x31.dapr.proto.runtime.v1.ConversationMessageContentB\n\n\x08_tool_id\"\x89\x01\n\x15\x43onversationToolCalls\x12\x0f\n\x02id\x18\x01 \x01(\tH\x01\x88\x01\x01\x12J\n\x08\x66unction\x18\x02 \x01(\x0b\x32\x36.dapr.proto.runtime.v1.ConversationToolCallsOfFunctionH\x00\x42\x0c\n\ntool_typesB\x05\n\x03_id\"B\n\x1f\x43onversationToolCallsOfFunction\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\targuments\x18\x02 \x01(\t\"*\n\x1a\x43onversationMessageContent\x12\x0c\n\x04text\x18\x01 \x01(\t\"\xc0\x01\n\x12\x43onversationResult\x12\x0e\n\x06result\x18\x01 \x01(\t\x12M\n\nparameters\x18\x02 \x03(\x0b\x32\x39.dapr.proto.runtime.v1.ConversationResult.ParametersEntry\x1aG\n\x0fParametersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12#\n\x05value\x18\x02 \x01(\x0b\x32\x14.google.protobuf.Any:\x02\x38\x01:\x02\x18\x01\"]\n\x18\x43onversationResultAlpha2\x12\x41\n\x07\x63hoices\x18\x01 \x03(\x0b\x32\x30.dapr.proto.runtime.v1.ConversationResultChoices\"\x84\x01\n\x19\x43onversationResultChoices\x12\x15\n\rfinish_reason\x18\x01 \x01(\t\x12\r\n\x05index\x18\x02 \x01(\x03\x12\x41\n\x07message\x18\x03 \x01(\x0b\x32\x30.dapr.proto.runtime.v1.ConversationResultMessage\"n\n\x19\x43onversationResultMessage\x12\x0f\n\x07\x63ontent\x18\x01 \x01(\t\x12@\n\ntool_calls\x18\x02 \x03(\x0b\x32,.dapr.proto.runtime.v1.ConversationToolCalls\"|\n\x14\x43onversationResponse\x12\x16\n\tcontextID\x18\x01 \x01(\tH\x00\x88\x01\x01\x12:\n\x07outputs\x18\x02 \x03(\x0b\x32).dapr.proto.runtime.v1.ConversationResult:\x02\x18\x01\x42\x0c\n\n_contextID\"\x86\x01\n\x1a\x43onversationResponseAlpha2\x12\x17\n\ncontext_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12@\n\x07outputs\x18\x02 \x03(\x0b\x32/.dapr.proto.runtime.v1.ConversationResultAlpha2B\r\n\x0b_context_id\"g\n\x11\x43onversationTools\x12\x44\n\x08\x66unction\x18\x01 \x01(\x0b\x32\x30.dapr.proto.runtime.v1.ConversationToolsFunctionH\x00\x42\x0c\n\ntool_types\"\x80\x01\n\x19\x43onversationToolsFunction\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x00\x88\x01\x01\x12+\n\nparameters\x18\x03 \x01(\x0b\x32\x17.google.protobuf.StructB\x0e\n\x0c_descriptionBi\n\nio.dapr.v1B\nDaprProtosZ1github.com/dapr/dapr/pkg/proto/runtime/v1;runtime\xaa\x02\x1b\x44\x61pr.Client.Autogen.Grpc.v1b\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1e\x64\x61pr/proto/runtime/v1/ai.proto\x12\x15\x64\x61pr.proto.runtime.v1\x1a\x19google/protobuf/any.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1egoogle/protobuf/duration.proto\"\xeb\x03\n\x13\x43onversationRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x16\n\tcontextID\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x38\n\x06inputs\x18\x03 \x03(\x0b\x32(.dapr.proto.runtime.v1.ConversationInput\x12N\n\nparameters\x18\x04 \x03(\x0b\x32:.dapr.proto.runtime.v1.ConversationRequest.ParametersEntry\x12J\n\x08metadata\x18\x05 \x03(\x0b\x32\x38.dapr.proto.runtime.v1.ConversationRequest.MetadataEntry\x12\x15\n\x08scrubPII\x18\x06 \x01(\x08H\x01\x88\x01\x01\x12\x18\n\x0btemperature\x18\x07 \x01(\x01H\x02\x88\x01\x01\x1aG\n\x0fParametersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12#\n\x05value\x18\x02 \x01(\x0b\x32\x14.google.protobuf.Any:\x02\x38\x01\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01:\x02\x18\x01\x42\x0c\n\n_contextIDB\x0b\n\t_scrubPIIB\x0e\n\x0c_temperature\"\x8c\x06\n\x19\x43onversationRequestAlpha2\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x17\n\ncontext_id\x18\x02 \x01(\tH\x00\x88\x01\x01\x12>\n\x06inputs\x18\x03 \x03(\x0b\x32..dapr.proto.runtime.v1.ConversationInputAlpha2\x12T\n\nparameters\x18\x04 \x03(\x0b\x32@.dapr.proto.runtime.v1.ConversationRequestAlpha2.ParametersEntry\x12P\n\x08metadata\x18\x05 \x03(\x0b\x32>.dapr.proto.runtime.v1.ConversationRequestAlpha2.MetadataEntry\x12\x16\n\tscrub_pii\x18\x06 \x01(\x08H\x01\x88\x01\x01\x12\x18\n\x0btemperature\x18\x07 \x01(\x01H\x02\x88\x01\x01\x12\x37\n\x05tools\x18\x08 \x03(\x0b\x32(.dapr.proto.runtime.v1.ConversationTools\x12\x18\n\x0btool_choice\x18\t \x01(\tH\x03\x88\x01\x01\x12\x35\n\x0fresponse_format\x18\n \x01(\x0b\x32\x17.google.protobuf.StructH\x04\x88\x01\x01\x12>\n\x16prompt_cache_retention\x18\x0b \x01(\x0b\x32\x19.google.protobuf.DurationH\x05\x88\x01\x01\x1aG\n\x0fParametersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12#\n\x05value\x18\x02 \x01(\x0b\x32\x14.google.protobuf.Any:\x02\x38\x01\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\r\n\x0b_context_idB\x0c\n\n_scrub_piiB\x0e\n\x0c_temperatureB\x0e\n\x0c_tool_choiceB\x12\n\x10_response_formatB\x19\n\x17_prompt_cache_retention\"h\n\x11\x43onversationInput\x12\x0f\n\x07\x63ontent\x18\x01 \x01(\t\x12\x11\n\x04role\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x15\n\x08scrubPII\x18\x03 \x01(\x08H\x01\x88\x01\x01:\x02\x18\x01\x42\x07\n\x05_roleB\x0b\n\t_scrubPII\"}\n\x17\x43onversationInputAlpha2\x12<\n\x08messages\x18\x01 \x03(\x0b\x32*.dapr.proto.runtime.v1.ConversationMessage\x12\x16\n\tscrub_pii\x18\x02 \x01(\x08H\x00\x88\x01\x01\x42\x0c\n\n_scrub_pii\"\x97\x03\n\x13\x43onversationMessage\x12M\n\x0cof_developer\x18\x01 \x01(\x0b\x32\x35.dapr.proto.runtime.v1.ConversationMessageOfDeveloperH\x00\x12G\n\tof_system\x18\x02 \x01(\x0b\x32\x32.dapr.proto.runtime.v1.ConversationMessageOfSystemH\x00\x12\x43\n\x07of_user\x18\x03 \x01(\x0b\x32\x30.dapr.proto.runtime.v1.ConversationMessageOfUserH\x00\x12M\n\x0cof_assistant\x18\x04 \x01(\x0b\x32\x35.dapr.proto.runtime.v1.ConversationMessageOfAssistantH\x00\x12\x43\n\x07of_tool\x18\x05 \x01(\x0b\x32\x30.dapr.proto.runtime.v1.ConversationMessageOfToolH\x00\x42\x0f\n\rmessage_types\"\x80\x01\n\x1e\x43onversationMessageOfDeveloper\x12\x11\n\x04name\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x42\n\x07\x63ontent\x18\x02 \x03(\x0b\x32\x31.dapr.proto.runtime.v1.ConversationMessageContentB\x07\n\x05_name\"}\n\x1b\x43onversationMessageOfSystem\x12\x11\n\x04name\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x42\n\x07\x63ontent\x18\x02 \x03(\x0b\x32\x31.dapr.proto.runtime.v1.ConversationMessageContentB\x07\n\x05_name\"{\n\x19\x43onversationMessageOfUser\x12\x11\n\x04name\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x42\n\x07\x63ontent\x18\x02 \x03(\x0b\x32\x31.dapr.proto.runtime.v1.ConversationMessageContentB\x07\n\x05_name\"\xc2\x01\n\x1e\x43onversationMessageOfAssistant\x12\x11\n\x04name\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x42\n\x07\x63ontent\x18\x02 \x03(\x0b\x32\x31.dapr.proto.runtime.v1.ConversationMessageContent\x12@\n\ntool_calls\x18\x03 \x03(\x0b\x32,.dapr.proto.runtime.v1.ConversationToolCallsB\x07\n\x05_name\"\x8f\x01\n\x19\x43onversationMessageOfTool\x12\x14\n\x07tool_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x42\n\x07\x63ontent\x18\x03 \x03(\x0b\x32\x31.dapr.proto.runtime.v1.ConversationMessageContentB\n\n\x08_tool_id\"\x89\x01\n\x15\x43onversationToolCalls\x12\x0f\n\x02id\x18\x01 \x01(\tH\x01\x88\x01\x01\x12J\n\x08\x66unction\x18\x02 \x01(\x0b\x32\x36.dapr.proto.runtime.v1.ConversationToolCallsOfFunctionH\x00\x42\x0c\n\ntool_typesB\x05\n\x03_id\"B\n\x1f\x43onversationToolCallsOfFunction\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\targuments\x18\x02 \x01(\t\"*\n\x1a\x43onversationMessageContent\x12\x0c\n\x04text\x18\x01 \x01(\t\"\xc0\x01\n\x12\x43onversationResult\x12\x0e\n\x06result\x18\x01 \x01(\t\x12M\n\nparameters\x18\x02 \x03(\x0b\x32\x39.dapr.proto.runtime.v1.ConversationResult.ParametersEntry\x1aG\n\x0fParametersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12#\n\x05value\x18\x02 \x01(\x0b\x32\x14.google.protobuf.Any:\x02\x38\x01:\x02\x18\x01\"\xd9\x01\n\x18\x43onversationResultAlpha2\x12\x41\n\x07\x63hoices\x18\x01 \x03(\x0b\x32\x30.dapr.proto.runtime.v1.ConversationResultChoices\x12\x12\n\x05model\x18\x02 \x01(\tH\x00\x88\x01\x01\x12R\n\x05usage\x18\x03 \x01(\x0b\x32>.dapr.proto.runtime.v1.ConversationResultAlpha2CompletionUsageH\x01\x88\x01\x01\x42\x08\n\x06_modelB\x08\n\x06_usage\"\x9f\x03\n\'ConversationResultAlpha2CompletionUsage\x12\x19\n\x11\x63ompletion_tokens\x18\x01 \x01(\x04\x12\x15\n\rprompt_tokens\x18\x02 \x01(\x04\x12\x14\n\x0ctotal_tokens\x18\x03 \x01(\x04\x12}\n\x19\x63ompletion_tokens_details\x18\x04 \x01(\x0b\x32U.dapr.proto.runtime.v1.ConversationResultAlpha2CompletionUsageCompletionTokensDetailsH\x00\x88\x01\x01\x12u\n\x15prompt_tokens_details\x18\x05 \x01(\x0b\x32Q.dapr.proto.runtime.v1.ConversationResultAlpha2CompletionUsagePromptTokensDetailsH\x01\x88\x01\x01\x42\x1c\n\x1a_completion_tokens_detailsB\x18\n\x16_prompt_tokens_details\"\xb8\x01\n>ConversationResultAlpha2CompletionUsageCompletionTokensDetails\x12\"\n\x1a\x61\x63\x63\x65pted_prediction_tokens\x18\x01 \x01(\x04\x12\x14\n\x0c\x61udio_tokens\x18\x02 \x01(\x04\x12\x18\n\x10reasoning_tokens\x18\x03 \x01(\x04\x12\"\n\x1arejected_prediction_tokens\x18\x04 \x01(\x04\"i\n:ConversationResultAlpha2CompletionUsagePromptTokensDetails\x12\x14\n\x0c\x61udio_tokens\x18\x01 \x01(\x04\x12\x15\n\rcached_tokens\x18\x02 \x01(\x04\"\x84\x01\n\x19\x43onversationResultChoices\x12\x15\n\rfinish_reason\x18\x01 \x01(\t\x12\r\n\x05index\x18\x02 \x01(\x03\x12\x41\n\x07message\x18\x03 \x01(\x0b\x32\x30.dapr.proto.runtime.v1.ConversationResultMessage\"n\n\x19\x43onversationResultMessage\x12\x0f\n\x07\x63ontent\x18\x01 \x01(\t\x12@\n\ntool_calls\x18\x02 \x03(\x0b\x32,.dapr.proto.runtime.v1.ConversationToolCalls\"|\n\x14\x43onversationResponse\x12\x16\n\tcontextID\x18\x01 \x01(\tH\x00\x88\x01\x01\x12:\n\x07outputs\x18\x02 \x03(\x0b\x32).dapr.proto.runtime.v1.ConversationResult:\x02\x18\x01\x42\x0c\n\n_contextID\"\x86\x01\n\x1a\x43onversationResponseAlpha2\x12\x17\n\ncontext_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12@\n\x07outputs\x18\x02 \x03(\x0b\x32/.dapr.proto.runtime.v1.ConversationResultAlpha2B\r\n\x0b_context_id\"g\n\x11\x43onversationTools\x12\x44\n\x08\x66unction\x18\x01 \x01(\x0b\x32\x30.dapr.proto.runtime.v1.ConversationToolsFunctionH\x00\x42\x0c\n\ntool_types\"\x80\x01\n\x19\x43onversationToolsFunction\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x02 \x01(\tH\x00\x88\x01\x01\x12+\n\nparameters\x18\x03 \x01(\x0b\x32\x17.google.protobuf.StructB\x0e\n\x0c_descriptionBi\n\nio.dapr.v1B\nDaprProtosZ1github.com/dapr/dapr/pkg/proto/runtime/v1;runtime\xaa\x02\x1b\x44\x61pr.Client.Autogen.Grpc.v1b\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -52,56 +53,62 @@ _globals['_CONVERSATIONRESULT']._serialized_options = b'\030\001' _globals['_CONVERSATIONRESPONSE']._loaded_options = None _globals['_CONVERSATIONRESPONSE']._serialized_options = b'\030\001' - _globals['_CONVERSATIONREQUEST']._serialized_start=115 - _globals['_CONVERSATIONREQUEST']._serialized_end=606 - _globals['_CONVERSATIONREQUEST_PARAMETERSENTRY']._serialized_start=439 - _globals['_CONVERSATIONREQUEST_PARAMETERSENTRY']._serialized_end=510 - _globals['_CONVERSATIONREQUEST_METADATAENTRY']._serialized_start=512 - _globals['_CONVERSATIONREQUEST_METADATAENTRY']._serialized_end=559 - _globals['_CONVERSATIONREQUESTALPHA2']._serialized_start=609 - _globals['_CONVERSATIONREQUESTALPHA2']._serialized_end=1223 - _globals['_CONVERSATIONREQUESTALPHA2_PARAMETERSENTRY']._serialized_start=439 - _globals['_CONVERSATIONREQUESTALPHA2_PARAMETERSENTRY']._serialized_end=510 - _globals['_CONVERSATIONREQUESTALPHA2_METADATAENTRY']._serialized_start=512 - _globals['_CONVERSATIONREQUESTALPHA2_METADATAENTRY']._serialized_end=559 - _globals['_CONVERSATIONINPUT']._serialized_start=1225 - _globals['_CONVERSATIONINPUT']._serialized_end=1329 - _globals['_CONVERSATIONINPUTALPHA2']._serialized_start=1331 - _globals['_CONVERSATIONINPUTALPHA2']._serialized_end=1456 - _globals['_CONVERSATIONMESSAGE']._serialized_start=1459 - _globals['_CONVERSATIONMESSAGE']._serialized_end=1866 - _globals['_CONVERSATIONMESSAGEOFDEVELOPER']._serialized_start=1869 - _globals['_CONVERSATIONMESSAGEOFDEVELOPER']._serialized_end=1997 - _globals['_CONVERSATIONMESSAGEOFSYSTEM']._serialized_start=1999 - _globals['_CONVERSATIONMESSAGEOFSYSTEM']._serialized_end=2124 - _globals['_CONVERSATIONMESSAGEOFUSER']._serialized_start=2126 - _globals['_CONVERSATIONMESSAGEOFUSER']._serialized_end=2249 - _globals['_CONVERSATIONMESSAGEOFASSISTANT']._serialized_start=2252 - _globals['_CONVERSATIONMESSAGEOFASSISTANT']._serialized_end=2446 - _globals['_CONVERSATIONMESSAGEOFTOOL']._serialized_start=2449 - _globals['_CONVERSATIONMESSAGEOFTOOL']._serialized_end=2592 - _globals['_CONVERSATIONTOOLCALLS']._serialized_start=2595 - _globals['_CONVERSATIONTOOLCALLS']._serialized_end=2732 - _globals['_CONVERSATIONTOOLCALLSOFFUNCTION']._serialized_start=2734 - _globals['_CONVERSATIONTOOLCALLSOFFUNCTION']._serialized_end=2800 - _globals['_CONVERSATIONMESSAGECONTENT']._serialized_start=2802 - _globals['_CONVERSATIONMESSAGECONTENT']._serialized_end=2844 - _globals['_CONVERSATIONRESULT']._serialized_start=2847 - _globals['_CONVERSATIONRESULT']._serialized_end=3039 - _globals['_CONVERSATIONRESULT_PARAMETERSENTRY']._serialized_start=439 - _globals['_CONVERSATIONRESULT_PARAMETERSENTRY']._serialized_end=510 - _globals['_CONVERSATIONRESULTALPHA2']._serialized_start=3041 - _globals['_CONVERSATIONRESULTALPHA2']._serialized_end=3134 - _globals['_CONVERSATIONRESULTCHOICES']._serialized_start=3137 - _globals['_CONVERSATIONRESULTCHOICES']._serialized_end=3269 - _globals['_CONVERSATIONRESULTMESSAGE']._serialized_start=3271 - _globals['_CONVERSATIONRESULTMESSAGE']._serialized_end=3381 - _globals['_CONVERSATIONRESPONSE']._serialized_start=3383 - _globals['_CONVERSATIONRESPONSE']._serialized_end=3507 - _globals['_CONVERSATIONRESPONSEALPHA2']._serialized_start=3510 - _globals['_CONVERSATIONRESPONSEALPHA2']._serialized_end=3644 - _globals['_CONVERSATIONTOOLS']._serialized_start=3646 - _globals['_CONVERSATIONTOOLS']._serialized_end=3749 - _globals['_CONVERSATIONTOOLSFUNCTION']._serialized_start=3752 - _globals['_CONVERSATIONTOOLSFUNCTION']._serialized_end=3880 + _globals['_CONVERSATIONREQUEST']._serialized_start=147 + _globals['_CONVERSATIONREQUEST']._serialized_end=638 + _globals['_CONVERSATIONREQUEST_PARAMETERSENTRY']._serialized_start=471 + _globals['_CONVERSATIONREQUEST_PARAMETERSENTRY']._serialized_end=542 + _globals['_CONVERSATIONREQUEST_METADATAENTRY']._serialized_start=544 + _globals['_CONVERSATIONREQUEST_METADATAENTRY']._serialized_end=591 + _globals['_CONVERSATIONREQUESTALPHA2']._serialized_start=641 + _globals['_CONVERSATIONREQUESTALPHA2']._serialized_end=1421 + _globals['_CONVERSATIONREQUESTALPHA2_PARAMETERSENTRY']._serialized_start=471 + _globals['_CONVERSATIONREQUESTALPHA2_PARAMETERSENTRY']._serialized_end=542 + _globals['_CONVERSATIONREQUESTALPHA2_METADATAENTRY']._serialized_start=544 + _globals['_CONVERSATIONREQUESTALPHA2_METADATAENTRY']._serialized_end=591 + _globals['_CONVERSATIONINPUT']._serialized_start=1423 + _globals['_CONVERSATIONINPUT']._serialized_end=1527 + _globals['_CONVERSATIONINPUTALPHA2']._serialized_start=1529 + _globals['_CONVERSATIONINPUTALPHA2']._serialized_end=1654 + _globals['_CONVERSATIONMESSAGE']._serialized_start=1657 + _globals['_CONVERSATIONMESSAGE']._serialized_end=2064 + _globals['_CONVERSATIONMESSAGEOFDEVELOPER']._serialized_start=2067 + _globals['_CONVERSATIONMESSAGEOFDEVELOPER']._serialized_end=2195 + _globals['_CONVERSATIONMESSAGEOFSYSTEM']._serialized_start=2197 + _globals['_CONVERSATIONMESSAGEOFSYSTEM']._serialized_end=2322 + _globals['_CONVERSATIONMESSAGEOFUSER']._serialized_start=2324 + _globals['_CONVERSATIONMESSAGEOFUSER']._serialized_end=2447 + _globals['_CONVERSATIONMESSAGEOFASSISTANT']._serialized_start=2450 + _globals['_CONVERSATIONMESSAGEOFASSISTANT']._serialized_end=2644 + _globals['_CONVERSATIONMESSAGEOFTOOL']._serialized_start=2647 + _globals['_CONVERSATIONMESSAGEOFTOOL']._serialized_end=2790 + _globals['_CONVERSATIONTOOLCALLS']._serialized_start=2793 + _globals['_CONVERSATIONTOOLCALLS']._serialized_end=2930 + _globals['_CONVERSATIONTOOLCALLSOFFUNCTION']._serialized_start=2932 + _globals['_CONVERSATIONTOOLCALLSOFFUNCTION']._serialized_end=2998 + _globals['_CONVERSATIONMESSAGECONTENT']._serialized_start=3000 + _globals['_CONVERSATIONMESSAGECONTENT']._serialized_end=3042 + _globals['_CONVERSATIONRESULT']._serialized_start=3045 + _globals['_CONVERSATIONRESULT']._serialized_end=3237 + _globals['_CONVERSATIONRESULT_PARAMETERSENTRY']._serialized_start=471 + _globals['_CONVERSATIONRESULT_PARAMETERSENTRY']._serialized_end=542 + _globals['_CONVERSATIONRESULTALPHA2']._serialized_start=3240 + _globals['_CONVERSATIONRESULTALPHA2']._serialized_end=3457 + _globals['_CONVERSATIONRESULTALPHA2COMPLETIONUSAGE']._serialized_start=3460 + _globals['_CONVERSATIONRESULTALPHA2COMPLETIONUSAGE']._serialized_end=3875 + _globals['_CONVERSATIONRESULTALPHA2COMPLETIONUSAGECOMPLETIONTOKENSDETAILS']._serialized_start=3878 + _globals['_CONVERSATIONRESULTALPHA2COMPLETIONUSAGECOMPLETIONTOKENSDETAILS']._serialized_end=4062 + _globals['_CONVERSATIONRESULTALPHA2COMPLETIONUSAGEPROMPTTOKENSDETAILS']._serialized_start=4064 + _globals['_CONVERSATIONRESULTALPHA2COMPLETIONUSAGEPROMPTTOKENSDETAILS']._serialized_end=4169 + _globals['_CONVERSATIONRESULTCHOICES']._serialized_start=4172 + _globals['_CONVERSATIONRESULTCHOICES']._serialized_end=4304 + _globals['_CONVERSATIONRESULTMESSAGE']._serialized_start=4306 + _globals['_CONVERSATIONRESULTMESSAGE']._serialized_end=4416 + _globals['_CONVERSATIONRESPONSE']._serialized_start=4418 + _globals['_CONVERSATIONRESPONSE']._serialized_end=4542 + _globals['_CONVERSATIONRESPONSEALPHA2']._serialized_start=4545 + _globals['_CONVERSATIONRESPONSEALPHA2']._serialized_end=4679 + _globals['_CONVERSATIONTOOLS']._serialized_start=4681 + _globals['_CONVERSATIONTOOLS']._serialized_end=4784 + _globals['_CONVERSATIONTOOLSFUNCTION']._serialized_start=4787 + _globals['_CONVERSATIONTOOLSFUNCTION']._serialized_end=4915 # @@protoc_insertion_point(module_scope) diff --git a/dapr/proto/runtime/v1/ai_pb2.pyi b/dapr/proto/runtime/v1/ai_pb2.pyi index 0497cae3b..4689b847a 100644 --- a/dapr/proto/runtime/v1/ai_pb2.pyi +++ b/dapr/proto/runtime/v1/ai_pb2.pyi @@ -18,6 +18,7 @@ import builtins import collections.abc import google.protobuf.any_pb2 import google.protobuf.descriptor +import google.protobuf.duration_pb2 import google.protobuf.internal.containers import google.protobuf.message import google.protobuf.struct_pb2 @@ -39,7 +40,12 @@ DESCRIPTOR: google.protobuf.descriptor.FileDescriptor @deprecated("""This message has been marked as deprecated using proto message options.""") @typing.final class ConversationRequest(google.protobuf.message.Message): - """ConversationRequest is the request object for Conversation.""" + """Note: in general for conversation api reference these links: + https://platform.openai.com/docs/api-reference/chat/create + https://github.com/openai/openai-go/blob/main/chatcompletion.go + + ConversationRequest is the request object for Conversation. + """ DESCRIPTOR: google.protobuf.descriptor.Descriptor @@ -139,7 +145,9 @@ Global___ConversationRequest: typing_extensions.TypeAlias = ConversationRequest @typing.final class ConversationRequestAlpha2(google.protobuf.message.Message): - """ConversationRequestAlpha2 is the new request object for Conversation. + """Also, when we go stable we need to remove context_id and parameters in ConversationRequestAlpha2 as these are not used. + + ConversationRequestAlpha2 is the new request object for Conversation. Many of these fields are inspired by openai.ChatCompletionNewParams https://github.com/openai/openai-go/blob/main/chatcompletion.go#L2106 """ @@ -192,6 +200,8 @@ class ConversationRequestAlpha2(google.protobuf.message.Message): TEMPERATURE_FIELD_NUMBER: builtins.int TOOLS_FIELD_NUMBER: builtins.int TOOL_CHOICE_FIELD_NUMBER: builtins.int + RESPONSE_FORMAT_FIELD_NUMBER: builtins.int + PROMPT_CACHE_RETENTION_FIELD_NUMBER: builtins.int name: builtins.str """The name of Conversation component""" context_id: builtins.str @@ -213,9 +223,7 @@ class ConversationRequestAlpha2(google.protobuf.message.Message): """ @property def inputs(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___ConversationInputAlpha2]: - """Inputs for the conversation, support multiple input in one time. - This is the revamped conversation inputs better matching openai. - """ + """Inputs for the conversation.""" @property def parameters(self) -> google.protobuf.internal.containers.MessageMap[builtins.str, google.protobuf.any_pb2.Any]: @@ -223,7 +231,13 @@ class ConversationRequestAlpha2(google.protobuf.message.Message): @property def metadata(self) -> google.protobuf.internal.containers.ScalarMap[builtins.str, builtins.str]: - """The metadata passing to conversation components.""" + """Set of 16 key-value pairs that can be attached to the conversation. + This can be useful for storing additional information about the object in a structured format, + and querying for objects via API or the dashboard. + Keys are strings with a maximum length of 64 characters. + Values are strings with a maximum length of 512 characters. + NOTE: In the next iteration of this API, this will be within the HTTP/gRPC headers instead. + """ @property def tools(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___ConversationTools]: @@ -233,6 +247,30 @@ class ConversationRequestAlpha2(google.protobuf.message.Message): may be different than tools specified later on. """ + @property + def response_format(self) -> google.protobuf.struct_pb2.Struct: + """Structured outputs described using a JSON Schema object. + Use this when you want strict, typed structured output. + This corresponds to OpenAI's: + { "type": "json_schema", "json_schema": { ... } } + + The schema must be provided as a parsed JSON object. + Note: This is currently only supported by OpenAI components. + This is only supported by Deepseek, GoogleAI, HuggingFace, OpenAI, and Anthropic. + inspired by openai.ResponseFormat + ref: https://github.com/openai/openai-go/blob/main/chatcompletion.go#L3111 + """ + + @property + def prompt_cache_retention(self) -> google.protobuf.duration_pb2.Duration: + """Retention policy for the prompt cache. + If using OpenAI with this value set to `24h` it enables extended prompt caching, + which keeps cached prefixes active for longer, up to a maximum of 24 hours. + [Learn more](https://platform.openai.com/docs/guides/prompt-caching#prompt-cache-retention). + inspired by openai.ChatCompletionMessageParamUnion.PromptCacheRetention + ref: https://github.com/openai/openai-go/blob/main/chatcompletion.go#L3030 + """ + def __init__( self, *, @@ -245,13 +283,19 @@ class ConversationRequestAlpha2(google.protobuf.message.Message): temperature: builtins.float | None = ..., tools: collections.abc.Iterable[Global___ConversationTools] | None = ..., tool_choice: builtins.str | None = ..., + response_format: google.protobuf.struct_pb2.Struct | None = ..., + prompt_cache_retention: google.protobuf.duration_pb2.Duration | None = ..., ) -> None: ... - _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_context_id", b"_context_id", "_scrub_pii", b"_scrub_pii", "_temperature", b"_temperature", "_tool_choice", b"_tool_choice", "context_id", b"context_id", "scrub_pii", b"scrub_pii", "temperature", b"temperature", "tool_choice", b"tool_choice"] + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_context_id", b"_context_id", "_prompt_cache_retention", b"_prompt_cache_retention", "_response_format", b"_response_format", "_scrub_pii", b"_scrub_pii", "_temperature", b"_temperature", "_tool_choice", b"_tool_choice", "context_id", b"context_id", "prompt_cache_retention", b"prompt_cache_retention", "response_format", b"response_format", "scrub_pii", b"scrub_pii", "temperature", b"temperature", "tool_choice", b"tool_choice"] def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... - _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_context_id", b"_context_id", "_scrub_pii", b"_scrub_pii", "_temperature", b"_temperature", "_tool_choice", b"_tool_choice", "context_id", b"context_id", "inputs", b"inputs", "metadata", b"metadata", "name", b"name", "parameters", b"parameters", "scrub_pii", b"scrub_pii", "temperature", b"temperature", "tool_choice", b"tool_choice", "tools", b"tools"] + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_context_id", b"_context_id", "_prompt_cache_retention", b"_prompt_cache_retention", "_response_format", b"_response_format", "_scrub_pii", b"_scrub_pii", "_temperature", b"_temperature", "_tool_choice", b"_tool_choice", "context_id", b"context_id", "inputs", b"inputs", "metadata", b"metadata", "name", b"name", "parameters", b"parameters", "prompt_cache_retention", b"prompt_cache_retention", "response_format", b"response_format", "scrub_pii", b"scrub_pii", "temperature", b"temperature", "tool_choice", b"tool_choice", "tools", b"tools"] def ClearField(self, field_name: _ClearFieldArgType) -> None: ... _WhichOneofReturnType__context_id: typing_extensions.TypeAlias = typing.Literal["context_id"] _WhichOneofArgType__context_id: typing_extensions.TypeAlias = typing.Literal["_context_id", b"_context_id"] + _WhichOneofReturnType__prompt_cache_retention: typing_extensions.TypeAlias = typing.Literal["prompt_cache_retention"] + _WhichOneofArgType__prompt_cache_retention: typing_extensions.TypeAlias = typing.Literal["_prompt_cache_retention", b"_prompt_cache_retention"] + _WhichOneofReturnType__response_format: typing_extensions.TypeAlias = typing.Literal["response_format"] + _WhichOneofArgType__response_format: typing_extensions.TypeAlias = typing.Literal["_response_format", b"_response_format"] _WhichOneofReturnType__scrub_pii: typing_extensions.TypeAlias = typing.Literal["scrub_pii"] _WhichOneofArgType__scrub_pii: typing_extensions.TypeAlias = typing.Literal["_scrub_pii", b"_scrub_pii"] _WhichOneofReturnType__temperature: typing_extensions.TypeAlias = typing.Literal["temperature"] @@ -261,6 +305,10 @@ class ConversationRequestAlpha2(google.protobuf.message.Message): @typing.overload def WhichOneof(self, oneof_group: _WhichOneofArgType__context_id) -> _WhichOneofReturnType__context_id | None: ... @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__prompt_cache_retention) -> _WhichOneofReturnType__prompt_cache_retention | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__response_format) -> _WhichOneofReturnType__response_format | None: ... + @typing.overload def WhichOneof(self, oneof_group: _WhichOneofArgType__scrub_pii) -> _WhichOneofReturnType__scrub_pii | None: ... @typing.overload def WhichOneof(self, oneof_group: _WhichOneofArgType__temperature) -> _WhichOneofReturnType__temperature | None: ... @@ -309,7 +357,9 @@ Global___ConversationInput: typing_extensions.TypeAlias = ConversationInput @typing.final class ConversationInputAlpha2(google.protobuf.message.Message): - """directly inspired by openai.ChatCompletionNewParams + """TODO: when going stable just make these flat in the ConversationRequestAlpha2, + or reevaluate the grouping of fields... + directly inspired by openai.ChatCompletionNewParams https://github.com/openai/openai-go/blob/main/chatcompletion.go#L2106 """ @@ -497,9 +547,7 @@ class ConversationMessageOfAssistant(google.protobuf.message.Message): TOOL_CALLS_FIELD_NUMBER: builtins.int name: builtins.str @property - def content(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___ConversationMessageContent]: - """TODO: there is an audio field here to bring in when the time comes 1.17 or later.""" - + def content(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___ConversationMessageContent]: ... @property def tool_calls(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___ConversationToolCalls]: """Tool calls generated by the model, such as function calls for the client to then make.""" @@ -523,7 +571,11 @@ Global___ConversationMessageOfAssistant: typing_extensions.TypeAlias = Conversat @typing.final class ConversationMessageOfTool(google.protobuf.message.Message): - """inspired by openai.ChatCompletionToolMessageParam + """Note on ConversationMessageOfTool.tool_id: openai does have this as required; + however, some llm providers (ie mistral) do not require this field, + so we denote as optional. + + inspired by openai.ChatCompletionToolMessageParam https://github.com/openai/openai-go/blob/main/chatcompletion.go#L2011 ConversationMessageOfTool is intended to be the contents of a conversation message, as the role of a tool. @@ -573,7 +625,9 @@ class ConversationToolCalls(google.protobuf.message.Message): FUNCTION_FIELD_NUMBER: builtins.int id: builtins.str @property - def function(self) -> Global___ConversationToolCallsOfFunction: ... + def function(self) -> Global___ConversationToolCallsOfFunction: + """TODO: we are currently missing an OfCustom -> ConversationToolCallsOfFunction""" + def __init__( self, *, @@ -598,7 +652,7 @@ Global___ConversationToolCalls: typing_extensions.TypeAlias = ConversationToolCa @typing.final class ConversationToolCallsOfFunction(google.protobuf.message.Message): """inspired by openai.ChatCompletionMessageToolCallFunctionParam - https://github.com/openai/openai-go/blob/main/chatcompletion.go#L1692 + https://github.com/openai/openai-go/blob/main/chatcompletion.go#L1859 """ DESCRIPTOR: google.protobuf.descriptor.Descriptor @@ -696,25 +750,161 @@ Global___ConversationResult: typing_extensions.TypeAlias = ConversationResult class ConversationResultAlpha2(google.protobuf.message.Message): """inspired by openai.ChatCompletion ConversationResultAlpha2 is the result for one input. + https://github.com/openai/openai-go/blob/main/chatcompletion.go#L167 """ DESCRIPTOR: google.protobuf.descriptor.Descriptor CHOICES_FIELD_NUMBER: builtins.int + MODEL_FIELD_NUMBER: builtins.int + USAGE_FIELD_NUMBER: builtins.int + model: builtins.str + """The model used for the conversation.""" @property def choices(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___ConversationResultChoices]: """Result for the conversation input.""" + @property + def usage(self) -> Global___ConversationResultAlpha2CompletionUsage: + """Usage statistics for the completion request.""" + def __init__( self, *, choices: collections.abc.Iterable[Global___ConversationResultChoices] | None = ..., + model: builtins.str | None = ..., + usage: Global___ConversationResultAlpha2CompletionUsage | None = ..., ) -> None: ... - _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["choices", b"choices"] + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_model", b"_model", "_usage", b"_usage", "model", b"model", "usage", b"usage"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_model", b"_model", "_usage", b"_usage", "choices", b"choices", "model", b"model", "usage", b"usage"] def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__model: typing_extensions.TypeAlias = typing.Literal["model"] + _WhichOneofArgType__model: typing_extensions.TypeAlias = typing.Literal["_model", b"_model"] + _WhichOneofReturnType__usage: typing_extensions.TypeAlias = typing.Literal["usage"] + _WhichOneofArgType__usage: typing_extensions.TypeAlias = typing.Literal["_usage", b"_usage"] + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__model) -> _WhichOneofReturnType__model | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__usage) -> _WhichOneofReturnType__usage | None: ... Global___ConversationResultAlpha2: typing_extensions.TypeAlias = ConversationResultAlpha2 +@typing.final +class ConversationResultAlpha2CompletionUsage(google.protobuf.message.Message): + """ref: https://github.com/openai/openai-go/blob/main/completion.go#L162 + inspired by openai.ChatCompletion.Usage of type CompletionUsage + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + COMPLETION_TOKENS_FIELD_NUMBER: builtins.int + PROMPT_TOKENS_FIELD_NUMBER: builtins.int + TOTAL_TOKENS_FIELD_NUMBER: builtins.int + COMPLETION_TOKENS_DETAILS_FIELD_NUMBER: builtins.int + PROMPT_TOKENS_DETAILS_FIELD_NUMBER: builtins.int + completion_tokens: builtins.int + """Number of tokens in the generated completion.""" + prompt_tokens: builtins.int + """Number of tokens in the prompt.""" + total_tokens: builtins.int + """Total number of tokens used in the request (prompt + completion).""" + @property + def completion_tokens_details(self) -> Global___ConversationResultAlpha2CompletionUsageCompletionTokensDetails: + """Breakdown of tokens used in completion.""" + + @property + def prompt_tokens_details(self) -> Global___ConversationResultAlpha2CompletionUsagePromptTokensDetails: + """Breakdown of tokens used in the prompt.""" + + def __init__( + self, + *, + completion_tokens: builtins.int = ..., + prompt_tokens: builtins.int = ..., + total_tokens: builtins.int = ..., + completion_tokens_details: Global___ConversationResultAlpha2CompletionUsageCompletionTokensDetails | None = ..., + prompt_tokens_details: Global___ConversationResultAlpha2CompletionUsagePromptTokensDetails | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_completion_tokens_details", b"_completion_tokens_details", "_prompt_tokens_details", b"_prompt_tokens_details", "completion_tokens_details", b"completion_tokens_details", "prompt_tokens_details", b"prompt_tokens_details"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_completion_tokens_details", b"_completion_tokens_details", "_prompt_tokens_details", b"_prompt_tokens_details", "completion_tokens", b"completion_tokens", "completion_tokens_details", b"completion_tokens_details", "prompt_tokens", b"prompt_tokens", "prompt_tokens_details", b"prompt_tokens_details", "total_tokens", b"total_tokens"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__completion_tokens_details: typing_extensions.TypeAlias = typing.Literal["completion_tokens_details"] + _WhichOneofArgType__completion_tokens_details: typing_extensions.TypeAlias = typing.Literal["_completion_tokens_details", b"_completion_tokens_details"] + _WhichOneofReturnType__prompt_tokens_details: typing_extensions.TypeAlias = typing.Literal["prompt_tokens_details"] + _WhichOneofArgType__prompt_tokens_details: typing_extensions.TypeAlias = typing.Literal["_prompt_tokens_details", b"_prompt_tokens_details"] + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__completion_tokens_details) -> _WhichOneofReturnType__completion_tokens_details | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__prompt_tokens_details) -> _WhichOneofReturnType__prompt_tokens_details | None: ... + +Global___ConversationResultAlpha2CompletionUsage: typing_extensions.TypeAlias = ConversationResultAlpha2CompletionUsage + +@typing.final +class ConversationResultAlpha2CompletionUsageCompletionTokensDetails(google.protobuf.message.Message): + """inspired by openai.CompletionUsageCompletionTokensDetails + ref: https://github.com/openai/openai-go/blob/main/completion.go#L192 + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + ACCEPTED_PREDICTION_TOKENS_FIELD_NUMBER: builtins.int + AUDIO_TOKENS_FIELD_NUMBER: builtins.int + REASONING_TOKENS_FIELD_NUMBER: builtins.int + REJECTED_PREDICTION_TOKENS_FIELD_NUMBER: builtins.int + accepted_prediction_tokens: builtins.int + """When using Predicted Outputs, + the number of tokens in the prediction that appeared in the completion. + """ + audio_tokens: builtins.int + """Audio input tokens generated by the model.""" + reasoning_tokens: builtins.int + """Tokens generated by the model for reasoning.""" + rejected_prediction_tokens: builtins.int + """When using Predicted Outputs, the number of tokens in the prediction that did + not appear in the completion. However, like reasoning tokens, these tokens are + still counted in the total completion tokens for purposes of billing, output, + and context window limits. + """ + def __init__( + self, + *, + accepted_prediction_tokens: builtins.int = ..., + audio_tokens: builtins.int = ..., + reasoning_tokens: builtins.int = ..., + rejected_prediction_tokens: builtins.int = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["accepted_prediction_tokens", b"accepted_prediction_tokens", "audio_tokens", b"audio_tokens", "reasoning_tokens", b"reasoning_tokens", "rejected_prediction_tokens", b"rejected_prediction_tokens"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ConversationResultAlpha2CompletionUsageCompletionTokensDetails: typing_extensions.TypeAlias = ConversationResultAlpha2CompletionUsageCompletionTokensDetails + +@typing.final +class ConversationResultAlpha2CompletionUsagePromptTokensDetails(google.protobuf.message.Message): + """inspired by openai.CompletionUsagePromptTokensDetails + ref: https://github.com/openai/openai-go/blob/main/completion.go#L223C6-L223C40 + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + AUDIO_TOKENS_FIELD_NUMBER: builtins.int + CACHED_TOKENS_FIELD_NUMBER: builtins.int + audio_tokens: builtins.int + """Audio input tokens present in the prompt.""" + cached_tokens: builtins.int + """Cached tokens present in the prompt.""" + def __init__( + self, + *, + audio_tokens: builtins.int = ..., + cached_tokens: builtins.int = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["audio_tokens", b"audio_tokens", "cached_tokens", b"cached_tokens"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ConversationResultAlpha2CompletionUsagePromptTokensDetails: typing_extensions.TypeAlias = ConversationResultAlpha2CompletionUsagePromptTokensDetails + @typing.final class ConversationResultChoices(google.protobuf.message.Message): """inspired by openai.ChatCompletionChoice @@ -737,7 +927,9 @@ class ConversationResultChoices(google.protobuf.message.Message): index: builtins.int """The index of the choice in the list of choices.""" @property - def message(self) -> Global___ConversationResultMessage: ... + def message(self) -> Global___ConversationResultMessage: + """A chat completion message generated by the model.""" + def __init__( self, *, @@ -889,7 +1081,7 @@ class ConversationToolsFunction(google.protobuf.message.Message): def parameters(self) -> google.protobuf.struct_pb2.Struct: """The parameters the functions accepts, described as a JSON Schema object. See the [guide](https://platform.openai.com/docs/guides/function-calling) for examples, - and the [JSON Schema reference](https://json-schema.org/understanding-json-schema/) for documentation about the format. + and the [JSON Schema reference](https://json-schema.org/understanding-json-schema/) for documentation about the format. Omitting `parameters` defines a function with an empty parameter list. """ diff --git a/dapr/proto/runtime/v1/appcallback_pb2.py b/dapr/proto/runtime/v1/appcallback_pb2.py index eb8fdea45..24267f1e4 100644 --- a/dapr/proto/runtime/v1/appcallback_pb2.py +++ b/dapr/proto/runtime/v1/appcallback_pb2.py @@ -28,7 +28,7 @@ from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\'dapr/proto/runtime/v1/appcallback.proto\x12\x15\x64\x61pr.proto.runtime.v1\x1a\x19google/protobuf/any.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a!dapr/proto/common/v1/common.proto\x1a\x1cgoogle/protobuf/struct.proto\"\xa6\x01\n\x0fJobEventRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\"\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x14.google.protobuf.Any\x12\x0e\n\x06method\x18\x03 \x01(\t\x12\x14\n\x0c\x63ontent_type\x18\x04 \x01(\t\x12;\n\x0ehttp_extension\x18\x05 \x01(\x0b\x32#.dapr.proto.common.v1.HTTPExtension\"\x12\n\x10JobEventResponse\"\xdb\x01\n\x11TopicEventRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\x0c\n\x04type\x18\x03 \x01(\t\x12\x14\n\x0cspec_version\x18\x04 \x01(\t\x12\x19\n\x11\x64\x61ta_content_type\x18\x05 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x07 \x01(\x0c\x12\r\n\x05topic\x18\x06 \x01(\t\x12\x13\n\x0bpubsub_name\x18\x08 \x01(\t\x12\x0c\n\x04path\x18\t \x01(\t\x12+\n\nextensions\x18\n \x01(\x0b\x32\x17.google.protobuf.Struct\"\xa6\x01\n\x12TopicEventResponse\x12R\n\x06status\x18\x01 \x01(\x0e\x32\x42.dapr.proto.runtime.v1.TopicEventResponse.TopicEventResponseStatus\"<\n\x18TopicEventResponseStatus\x12\x0b\n\x07SUCCESS\x10\x00\x12\t\n\x05RETRY\x10\x01\x12\x08\n\x04\x44ROP\x10\x02\"\xab\x01\n\x13TopicEventCERequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\x0c\n\x04type\x18\x03 \x01(\t\x12\x14\n\x0cspec_version\x18\x04 \x01(\t\x12\x19\n\x11\x64\x61ta_content_type\x18\x05 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x06 \x01(\x0c\x12+\n\nextensions\x18\x07 \x01(\x0b\x32\x17.google.protobuf.Struct\"\xa5\x02\n\x1aTopicEventBulkRequestEntry\x12\x10\n\x08\x65ntry_id\x18\x01 \x01(\t\x12\x0f\n\x05\x62ytes\x18\x02 \x01(\x0cH\x00\x12\x41\n\x0b\x63loud_event\x18\x03 \x01(\x0b\x32*.dapr.proto.runtime.v1.TopicEventCERequestH\x00\x12\x14\n\x0c\x63ontent_type\x18\x04 \x01(\t\x12Q\n\x08metadata\x18\x05 \x03(\x0b\x32?.dapr.proto.runtime.v1.TopicEventBulkRequestEntry.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\x07\n\x05\x65vent\"\xa6\x02\n\x15TopicEventBulkRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x42\n\x07\x65ntries\x18\x02 \x03(\x0b\x32\x31.dapr.proto.runtime.v1.TopicEventBulkRequestEntry\x12L\n\x08metadata\x18\x03 \x03(\x0b\x32:.dapr.proto.runtime.v1.TopicEventBulkRequest.MetadataEntry\x12\r\n\x05topic\x18\x04 \x01(\t\x12\x13\n\x0bpubsub_name\x18\x05 \x01(\t\x12\x0c\n\x04type\x18\x06 \x01(\t\x12\x0c\n\x04path\x18\x07 \x01(\t\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x83\x01\n\x1bTopicEventBulkResponseEntry\x12\x10\n\x08\x65ntry_id\x18\x01 \x01(\t\x12R\n\x06status\x18\x02 \x01(\x0e\x32\x42.dapr.proto.runtime.v1.TopicEventResponse.TopicEventResponseStatus\"^\n\x16TopicEventBulkResponse\x12\x44\n\x08statuses\x18\x01 \x03(\x0b\x32\x32.dapr.proto.runtime.v1.TopicEventBulkResponseEntry\"\xae\x01\n\x13\x42indingEventRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x12J\n\x08metadata\x18\x03 \x03(\x0b\x32\x38.dapr.proto.runtime.v1.BindingEventRequest.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x88\x02\n\x14\x42indingEventResponse\x12\x12\n\nstore_name\x18\x01 \x01(\t\x12/\n\x06states\x18\x02 \x03(\x0b\x32\x1f.dapr.proto.common.v1.StateItem\x12\n\n\x02to\x18\x03 \x03(\t\x12\x0c\n\x04\x64\x61ta\x18\x04 \x01(\x0c\x12X\n\x0b\x63oncurrency\x18\x05 \x01(\x0e\x32\x43.dapr.proto.runtime.v1.BindingEventResponse.BindingEventConcurrency\"7\n\x17\x42indingEventConcurrency\x12\x0e\n\nSEQUENTIAL\x10\x00\x12\x0c\n\x08PARALLEL\x10\x01\"a\n\x1eListTopicSubscriptionsResponse\x12?\n\rsubscriptions\x18\x01 \x03(\x0b\x32(.dapr.proto.runtime.v1.TopicSubscription\"\xc5\x02\n\x11TopicSubscription\x12\x13\n\x0bpubsub_name\x18\x01 \x01(\t\x12\r\n\x05topic\x18\x02 \x01(\t\x12H\n\x08metadata\x18\x03 \x03(\x0b\x32\x36.dapr.proto.runtime.v1.TopicSubscription.MetadataEntry\x12\x32\n\x06routes\x18\x05 \x01(\x0b\x32\".dapr.proto.runtime.v1.TopicRoutes\x12\x19\n\x11\x64\x65\x61\x64_letter_topic\x18\x06 \x01(\t\x12\x42\n\x0e\x62ulk_subscribe\x18\x07 \x01(\x0b\x32*.dapr.proto.runtime.v1.BulkSubscribeConfig\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"O\n\x0bTopicRoutes\x12/\n\x05rules\x18\x01 \x03(\x0b\x32 .dapr.proto.runtime.v1.TopicRule\x12\x0f\n\x07\x64\x65\x66\x61ult\x18\x02 \x01(\t\"(\n\tTopicRule\x12\r\n\x05match\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\"a\n\x13\x42ulkSubscribeConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x1a\n\x12max_messages_count\x18\x02 \x01(\x05\x12\x1d\n\x15max_await_duration_ms\x18\x03 \x01(\x05\"-\n\x19ListInputBindingsResponse\x12\x10\n\x08\x62indings\x18\x01 \x03(\t\"\x15\n\x13HealthCheckResponse2\x86\x04\n\x0b\x41ppCallback\x12W\n\x08OnInvoke\x12#.dapr.proto.common.v1.InvokeRequest\x1a$.dapr.proto.common.v1.InvokeResponse\"\x00\x12i\n\x16ListTopicSubscriptions\x12\x16.google.protobuf.Empty\x1a\x35.dapr.proto.runtime.v1.ListTopicSubscriptionsResponse\"\x00\x12\x65\n\x0cOnTopicEvent\x12(.dapr.proto.runtime.v1.TopicEventRequest\x1a).dapr.proto.runtime.v1.TopicEventResponse\"\x00\x12_\n\x11ListInputBindings\x12\x16.google.protobuf.Empty\x1a\x30.dapr.proto.runtime.v1.ListInputBindingsResponse\"\x00\x12k\n\x0eOnBindingEvent\x12*.dapr.proto.runtime.v1.BindingEventRequest\x1a+.dapr.proto.runtime.v1.BindingEventResponse\"\x00\x32m\n\x16\x41ppCallbackHealthCheck\x12S\n\x0bHealthCheck\x12\x16.google.protobuf.Empty\x1a*.dapr.proto.runtime.v1.HealthCheckResponse\"\x00\x32\xf0\x01\n\x10\x41ppCallbackAlpha\x12w\n\x16OnBulkTopicEventAlpha1\x12,.dapr.proto.runtime.v1.TopicEventBulkRequest\x1a-.dapr.proto.runtime.v1.TopicEventBulkResponse\"\x00\x12\x63\n\x10OnJobEventAlpha1\x12&.dapr.proto.runtime.v1.JobEventRequest\x1a\'.dapr.proto.runtime.v1.JobEventResponseBy\n\nio.dapr.v1B\x15\x44\x61prAppCallbackProtosZ1github.com/dapr/dapr/pkg/proto/runtime/v1;runtime\xaa\x02 Dapr.AppCallback.Autogen.Grpc.v1b\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\'dapr/proto/runtime/v1/appcallback.proto\x12\x15\x64\x61pr.proto.runtime.v1\x1a\x19google/protobuf/any.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a!dapr/proto/common/v1/common.proto\x1a\x1cgoogle/protobuf/struct.proto\"\xa6\x01\n\x0fJobEventRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\"\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x14.google.protobuf.Any\x12\x0e\n\x06method\x18\x03 \x01(\t\x12\x14\n\x0c\x63ontent_type\x18\x04 \x01(\t\x12;\n\x0ehttp_extension\x18\x05 \x01(\x0b\x32#.dapr.proto.common.v1.HTTPExtension\"\x12\n\x10JobEventResponse\"\xdb\x01\n\x11TopicEventRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\x0c\n\x04type\x18\x03 \x01(\t\x12\x14\n\x0cspec_version\x18\x04 \x01(\t\x12\x19\n\x11\x64\x61ta_content_type\x18\x05 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x07 \x01(\x0c\x12\r\n\x05topic\x18\x06 \x01(\t\x12\x13\n\x0bpubsub_name\x18\x08 \x01(\t\x12\x0c\n\x04path\x18\t \x01(\t\x12+\n\nextensions\x18\n \x01(\x0b\x32\x17.google.protobuf.Struct\"\xa6\x01\n\x12TopicEventResponse\x12R\n\x06status\x18\x01 \x01(\x0e\x32\x42.dapr.proto.runtime.v1.TopicEventResponse.TopicEventResponseStatus\"<\n\x18TopicEventResponseStatus\x12\x0b\n\x07SUCCESS\x10\x00\x12\t\n\x05RETRY\x10\x01\x12\x08\n\x04\x44ROP\x10\x02\"\xab\x01\n\x13TopicEventCERequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\x0c\n\x04type\x18\x03 \x01(\t\x12\x14\n\x0cspec_version\x18\x04 \x01(\t\x12\x19\n\x11\x64\x61ta_content_type\x18\x05 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x06 \x01(\x0c\x12+\n\nextensions\x18\x07 \x01(\x0b\x32\x17.google.protobuf.Struct\"\xa5\x02\n\x1aTopicEventBulkRequestEntry\x12\x10\n\x08\x65ntry_id\x18\x01 \x01(\t\x12\x0f\n\x05\x62ytes\x18\x02 \x01(\x0cH\x00\x12\x41\n\x0b\x63loud_event\x18\x03 \x01(\x0b\x32*.dapr.proto.runtime.v1.TopicEventCERequestH\x00\x12\x14\n\x0c\x63ontent_type\x18\x04 \x01(\t\x12Q\n\x08metadata\x18\x05 \x03(\x0b\x32?.dapr.proto.runtime.v1.TopicEventBulkRequestEntry.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\x07\n\x05\x65vent\"\xa6\x02\n\x15TopicEventBulkRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x42\n\x07\x65ntries\x18\x02 \x03(\x0b\x32\x31.dapr.proto.runtime.v1.TopicEventBulkRequestEntry\x12L\n\x08metadata\x18\x03 \x03(\x0b\x32:.dapr.proto.runtime.v1.TopicEventBulkRequest.MetadataEntry\x12\r\n\x05topic\x18\x04 \x01(\t\x12\x13\n\x0bpubsub_name\x18\x05 \x01(\t\x12\x0c\n\x04type\x18\x06 \x01(\t\x12\x0c\n\x04path\x18\x07 \x01(\t\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x83\x01\n\x1bTopicEventBulkResponseEntry\x12\x10\n\x08\x65ntry_id\x18\x01 \x01(\t\x12R\n\x06status\x18\x02 \x01(\x0e\x32\x42.dapr.proto.runtime.v1.TopicEventResponse.TopicEventResponseStatus\"^\n\x16TopicEventBulkResponse\x12\x44\n\x08statuses\x18\x01 \x03(\x0b\x32\x32.dapr.proto.runtime.v1.TopicEventBulkResponseEntry\"\xae\x01\n\x13\x42indingEventRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x12J\n\x08metadata\x18\x03 \x03(\x0b\x32\x38.dapr.proto.runtime.v1.BindingEventRequest.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x88\x02\n\x14\x42indingEventResponse\x12\x12\n\nstore_name\x18\x01 \x01(\t\x12/\n\x06states\x18\x02 \x03(\x0b\x32\x1f.dapr.proto.common.v1.StateItem\x12\n\n\x02to\x18\x03 \x03(\t\x12\x0c\n\x04\x64\x61ta\x18\x04 \x01(\x0c\x12X\n\x0b\x63oncurrency\x18\x05 \x01(\x0e\x32\x43.dapr.proto.runtime.v1.BindingEventResponse.BindingEventConcurrency\"7\n\x17\x42indingEventConcurrency\x12\x0e\n\nSEQUENTIAL\x10\x00\x12\x0c\n\x08PARALLEL\x10\x01\"a\n\x1eListTopicSubscriptionsResponse\x12?\n\rsubscriptions\x18\x01 \x03(\x0b\x32(.dapr.proto.runtime.v1.TopicSubscription\"\xc5\x02\n\x11TopicSubscription\x12\x13\n\x0bpubsub_name\x18\x01 \x01(\t\x12\r\n\x05topic\x18\x02 \x01(\t\x12H\n\x08metadata\x18\x03 \x03(\x0b\x32\x36.dapr.proto.runtime.v1.TopicSubscription.MetadataEntry\x12\x32\n\x06routes\x18\x05 \x01(\x0b\x32\".dapr.proto.runtime.v1.TopicRoutes\x12\x19\n\x11\x64\x65\x61\x64_letter_topic\x18\x06 \x01(\t\x12\x42\n\x0e\x62ulk_subscribe\x18\x07 \x01(\x0b\x32*.dapr.proto.runtime.v1.BulkSubscribeConfig\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"O\n\x0bTopicRoutes\x12/\n\x05rules\x18\x01 \x03(\x0b\x32 .dapr.proto.runtime.v1.TopicRule\x12\x0f\n\x07\x64\x65\x66\x61ult\x18\x02 \x01(\t\"(\n\tTopicRule\x12\r\n\x05match\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\"a\n\x13\x42ulkSubscribeConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x1a\n\x12max_messages_count\x18\x02 \x01(\x05\x12\x1d\n\x15max_await_duration_ms\x18\x03 \x01(\x05\"-\n\x19ListInputBindingsResponse\x12\x10\n\x08\x62indings\x18\x01 \x03(\t\"\x15\n\x13HealthCheckResponse2\xf9\x04\n\x0b\x41ppCallback\x12W\n\x08OnInvoke\x12#.dapr.proto.common.v1.InvokeRequest\x1a$.dapr.proto.common.v1.InvokeResponse\"\x00\x12i\n\x16ListTopicSubscriptions\x12\x16.google.protobuf.Empty\x1a\x35.dapr.proto.runtime.v1.ListTopicSubscriptionsResponse\"\x00\x12\x65\n\x0cOnTopicEvent\x12(.dapr.proto.runtime.v1.TopicEventRequest\x1a).dapr.proto.runtime.v1.TopicEventResponse\"\x00\x12_\n\x11ListInputBindings\x12\x16.google.protobuf.Empty\x1a\x30.dapr.proto.runtime.v1.ListInputBindingsResponse\"\x00\x12k\n\x0eOnBindingEvent\x12*.dapr.proto.runtime.v1.BindingEventRequest\x1a+.dapr.proto.runtime.v1.BindingEventResponse\"\x00\x12q\n\x10OnBulkTopicEvent\x12,.dapr.proto.runtime.v1.TopicEventBulkRequest\x1a-.dapr.proto.runtime.v1.TopicEventBulkResponse\"\x00\x32m\n\x16\x41ppCallbackHealthCheck\x12S\n\x0bHealthCheck\x12\x16.google.protobuf.Empty\x1a*.dapr.proto.runtime.v1.HealthCheckResponse\"\x00\x32\xf3\x01\n\x10\x41ppCallbackAlpha\x12z\n\x16OnBulkTopicEventAlpha1\x12,.dapr.proto.runtime.v1.TopicEventBulkRequest\x1a-.dapr.proto.runtime.v1.TopicEventBulkResponse\"\x03\x88\x02\x01\x12\x63\n\x10OnJobEventAlpha1\x12&.dapr.proto.runtime.v1.JobEventRequest\x1a\'.dapr.proto.runtime.v1.JobEventResponseBy\n\nio.dapr.v1B\x15\x44\x61prAppCallbackProtosZ1github.com/dapr/dapr/pkg/proto/runtime/v1;runtime\xaa\x02 Dapr.AppCallback.Autogen.Grpc.v1b\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -44,6 +44,8 @@ _globals['_BINDINGEVENTREQUEST_METADATAENTRY']._serialized_options = b'8\001' _globals['_TOPICSUBSCRIPTION_METADATAENTRY']._loaded_options = None _globals['_TOPICSUBSCRIPTION_METADATAENTRY']._serialized_options = b'8\001' + _globals['_APPCALLBACKALPHA'].methods_by_name['OnBulkTopicEventAlpha1']._loaded_options = None + _globals['_APPCALLBACKALPHA'].methods_by_name['OnBulkTopicEventAlpha1']._serialized_options = b'\210\002\001' _globals['_JOBEVENTREQUEST']._serialized_start=188 _globals['_JOBEVENTREQUEST']._serialized_end=354 _globals['_JOBEVENTRESPONSE']._serialized_start=356 @@ -93,9 +95,9 @@ _globals['_HEALTHCHECKRESPONSE']._serialized_start=2904 _globals['_HEALTHCHECKRESPONSE']._serialized_end=2925 _globals['_APPCALLBACK']._serialized_start=2928 - _globals['_APPCALLBACK']._serialized_end=3446 - _globals['_APPCALLBACKHEALTHCHECK']._serialized_start=3448 - _globals['_APPCALLBACKHEALTHCHECK']._serialized_end=3557 - _globals['_APPCALLBACKALPHA']._serialized_start=3560 - _globals['_APPCALLBACKALPHA']._serialized_end=3800 + _globals['_APPCALLBACK']._serialized_end=3561 + _globals['_APPCALLBACKHEALTHCHECK']._serialized_start=3563 + _globals['_APPCALLBACKHEALTHCHECK']._serialized_end=3672 + _globals['_APPCALLBACKALPHA']._serialized_start=3675 + _globals['_APPCALLBACKALPHA']._serialized_end=3918 # @@protoc_insertion_point(module_scope) diff --git a/dapr/proto/runtime/v1/appcallback_pb2_grpc.py b/dapr/proto/runtime/v1/appcallback_pb2_grpc.py index d7bfe94b3..26c586cbc 100644 --- a/dapr/proto/runtime/v1/appcallback_pb2_grpc.py +++ b/dapr/proto/runtime/v1/appcallback_pb2_grpc.py @@ -64,6 +64,11 @@ def __init__(self, channel): request_serializer=dapr_dot_proto_dot_runtime_dot_v1_dot_appcallback__pb2.BindingEventRequest.SerializeToString, response_deserializer=dapr_dot_proto_dot_runtime_dot_v1_dot_appcallback__pb2.BindingEventResponse.FromString, _registered_method=True) + self.OnBulkTopicEvent = channel.unary_unary( + '/dapr.proto.runtime.v1.AppCallback/OnBulkTopicEvent', + request_serializer=dapr_dot_proto_dot_runtime_dot_v1_dot_appcallback__pb2.TopicEventBulkRequest.SerializeToString, + response_deserializer=dapr_dot_proto_dot_runtime_dot_v1_dot_appcallback__pb2.TopicEventBulkResponse.FromString, + _registered_method=True) class AppCallbackServicer(object): @@ -110,6 +115,13 @@ def OnBindingEvent(self, request, context): context.set_details('Method not implemented!') raise NotImplementedError('Method not implemented!') + def OnBulkTopicEvent(self, request, context): + """Subscribes bulk events from Pubsub + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + def add_AppCallbackServicer_to_server(servicer, server): rpc_method_handlers = { @@ -138,6 +150,11 @@ def add_AppCallbackServicer_to_server(servicer, server): request_deserializer=dapr_dot_proto_dot_runtime_dot_v1_dot_appcallback__pb2.BindingEventRequest.FromString, response_serializer=dapr_dot_proto_dot_runtime_dot_v1_dot_appcallback__pb2.BindingEventResponse.SerializeToString, ), + 'OnBulkTopicEvent': grpc.unary_unary_rpc_method_handler( + servicer.OnBulkTopicEvent, + request_deserializer=dapr_dot_proto_dot_runtime_dot_v1_dot_appcallback__pb2.TopicEventBulkRequest.FromString, + response_serializer=dapr_dot_proto_dot_runtime_dot_v1_dot_appcallback__pb2.TopicEventBulkResponse.SerializeToString, + ), } generic_handler = grpc.method_handlers_generic_handler( 'dapr.proto.runtime.v1.AppCallback', rpc_method_handlers) @@ -287,6 +304,33 @@ def OnBindingEvent(request, metadata, _registered_method=True) + @staticmethod + def OnBulkTopicEvent(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/dapr.proto.runtime.v1.AppCallback/OnBulkTopicEvent', + dapr_dot_proto_dot_runtime_dot_v1_dot_appcallback__pb2.TopicEventBulkRequest.SerializeToString, + dapr_dot_proto_dot_runtime_dot_v1_dot_appcallback__pb2.TopicEventBulkResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + class AppCallbackHealthCheckStub(object): """AppCallbackHealthCheck V1 is an optional extension to AppCallback V1 to implement diff --git a/dapr/proto/runtime/v1/dapr_pb2.py b/dapr/proto/runtime/v1/dapr_pb2.py index 1b790f38c..642ced434 100644 --- a/dapr/proto/runtime/v1/dapr_pb2.py +++ b/dapr/proto/runtime/v1/dapr_pb2.py @@ -39,7 +39,7 @@ from dapr.proto.runtime.v1 import ai_pb2 as dapr_dot_proto_dot_runtime_dot_v1_dot_ai__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n dapr/proto/runtime/v1/dapr.proto\x12\x15\x64\x61pr.proto.runtime.v1\x1a\x1bgoogle/protobuf/empty.proto\x1a!dapr/proto/common/v1/common.proto\x1a\"dapr/proto/runtime/v1/actors.proto\x1a\"dapr/proto/runtime/v1/pubsub.proto\x1a\"dapr/proto/runtime/v1/invoke.proto\x1a!dapr/proto/runtime/v1/state.proto\x1a#dapr/proto/runtime/v1/binding.proto\x1a\"dapr/proto/runtime/v1/secret.proto\x1a$dapr/proto/runtime/v1/metadata.proto\x1a)dapr/proto/runtime/v1/configuration.proto\x1a dapr/proto/runtime/v1/lock.proto\x1a\"dapr/proto/runtime/v1/crypto.proto\x1a$dapr/proto/runtime/v1/workflow.proto\x1a dapr/proto/runtime/v1/jobs.proto\x1a\x1e\x64\x61pr/proto/runtime/v1/ai.proto\"\x11\n\x0fShutdownRequest2\xce\x37\n\x04\x44\x61pr\x12\x64\n\rInvokeService\x12+.dapr.proto.runtime.v1.InvokeServiceRequest\x1a$.dapr.proto.common.v1.InvokeResponse\"\x00\x12]\n\x08GetState\x12&.dapr.proto.runtime.v1.GetStateRequest\x1a\'.dapr.proto.runtime.v1.GetStateResponse\"\x00\x12i\n\x0cGetBulkState\x12*.dapr.proto.runtime.v1.GetBulkStateRequest\x1a+.dapr.proto.runtime.v1.GetBulkStateResponse\"\x00\x12N\n\tSaveState\x12\'.dapr.proto.runtime.v1.SaveStateRequest\x1a\x16.google.protobuf.Empty\"\x00\x12i\n\x10QueryStateAlpha1\x12(.dapr.proto.runtime.v1.QueryStateRequest\x1a).dapr.proto.runtime.v1.QueryStateResponse\"\x00\x12R\n\x0b\x44\x65leteState\x12).dapr.proto.runtime.v1.DeleteStateRequest\x1a\x16.google.protobuf.Empty\"\x00\x12Z\n\x0f\x44\x65leteBulkState\x12-.dapr.proto.runtime.v1.DeleteBulkStateRequest\x1a\x16.google.protobuf.Empty\"\x00\x12j\n\x17\x45xecuteStateTransaction\x12\x35.dapr.proto.runtime.v1.ExecuteStateTransactionRequest\x1a\x16.google.protobuf.Empty\"\x00\x12T\n\x0cPublishEvent\x12*.dapr.proto.runtime.v1.PublishEventRequest\x1a\x16.google.protobuf.Empty\"\x00\x12q\n\x16\x42ulkPublishEventAlpha1\x12).dapr.proto.runtime.v1.BulkPublishRequest\x1a*.dapr.proto.runtime.v1.BulkPublishResponse\"\x00\x12\x97\x01\n\x1aSubscribeTopicEventsAlpha1\x12\x38.dapr.proto.runtime.v1.SubscribeTopicEventsRequestAlpha1\x1a\x39.dapr.proto.runtime.v1.SubscribeTopicEventsResponseAlpha1\"\x00(\x01\x30\x01\x12l\n\rInvokeBinding\x12+.dapr.proto.runtime.v1.InvokeBindingRequest\x1a,.dapr.proto.runtime.v1.InvokeBindingResponse\"\x00\x12`\n\tGetSecret\x12\'.dapr.proto.runtime.v1.GetSecretRequest\x1a(.dapr.proto.runtime.v1.GetSecretResponse\"\x00\x12l\n\rGetBulkSecret\x12+.dapr.proto.runtime.v1.GetBulkSecretRequest\x1a,.dapr.proto.runtime.v1.GetBulkSecretResponse\"\x00\x12`\n\x12RegisterActorTimer\x12\x30.dapr.proto.runtime.v1.RegisterActorTimerRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x64\n\x14UnregisterActorTimer\x12\x32.dapr.proto.runtime.v1.UnregisterActorTimerRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x66\n\x15RegisterActorReminder\x12\x33.dapr.proto.runtime.v1.RegisterActorReminderRequest\x1a\x16.google.protobuf.Empty\"\x00\x12j\n\x17UnregisterActorReminder\x12\x35.dapr.proto.runtime.v1.UnregisterActorReminderRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x9f\x01\n\x1eUnregisterActorRemindersByType\x12<.dapr.proto.runtime.v1.UnregisterActorRemindersByTypeRequest\x1a=.dapr.proto.runtime.v1.UnregisterActorRemindersByTypeResponse\"\x00\x12{\n\x12ListActorReminders\x12\x30.dapr.proto.runtime.v1.ListActorRemindersRequest\x1a\x31.dapr.proto.runtime.v1.ListActorRemindersResponse\"\x00\x12l\n\rGetActorState\x12+.dapr.proto.runtime.v1.GetActorStateRequest\x1a,.dapr.proto.runtime.v1.GetActorStateResponse\"\x00\x12u\n\x10GetActorReminder\x12..dapr.proto.runtime.v1.GetActorReminderRequest\x1a/.dapr.proto.runtime.v1.GetActorReminderResponse\"\x00\x12t\n\x1c\x45xecuteActorStateTransaction\x12:.dapr.proto.runtime.v1.ExecuteActorStateTransactionRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x66\n\x0bInvokeActor\x12).dapr.proto.runtime.v1.InvokeActorRequest\x1a*.dapr.proto.runtime.v1.InvokeActorResponse\"\x00\x12{\n\x16GetConfigurationAlpha1\x12..dapr.proto.runtime.v1.GetConfigurationRequest\x1a/.dapr.proto.runtime.v1.GetConfigurationResponse\"\x00\x12u\n\x10GetConfiguration\x12..dapr.proto.runtime.v1.GetConfigurationRequest\x1a/.dapr.proto.runtime.v1.GetConfigurationResponse\"\x00\x12\x8f\x01\n\x1cSubscribeConfigurationAlpha1\x12\x34.dapr.proto.runtime.v1.SubscribeConfigurationRequest\x1a\x35.dapr.proto.runtime.v1.SubscribeConfigurationResponse\"\x00\x30\x01\x12\x89\x01\n\x16SubscribeConfiguration\x12\x34.dapr.proto.runtime.v1.SubscribeConfigurationRequest\x1a\x35.dapr.proto.runtime.v1.SubscribeConfigurationResponse\"\x00\x30\x01\x12\x93\x01\n\x1eUnsubscribeConfigurationAlpha1\x12\x36.dapr.proto.runtime.v1.UnsubscribeConfigurationRequest\x1a\x37.dapr.proto.runtime.v1.UnsubscribeConfigurationResponse\"\x00\x12\x8d\x01\n\x18UnsubscribeConfiguration\x12\x36.dapr.proto.runtime.v1.UnsubscribeConfigurationRequest\x1a\x37.dapr.proto.runtime.v1.UnsubscribeConfigurationResponse\"\x00\x12`\n\rTryLockAlpha1\x12%.dapr.proto.runtime.v1.TryLockRequest\x1a&.dapr.proto.runtime.v1.TryLockResponse\"\x00\x12]\n\x0cUnlockAlpha1\x12$.dapr.proto.runtime.v1.UnlockRequest\x1a%.dapr.proto.runtime.v1.UnlockResponse\"\x00\x12\x62\n\rEncryptAlpha1\x12%.dapr.proto.runtime.v1.EncryptRequest\x1a&.dapr.proto.runtime.v1.EncryptResponse(\x01\x30\x01\x12\x62\n\rDecryptAlpha1\x12%.dapr.proto.runtime.v1.DecryptRequest\x1a&.dapr.proto.runtime.v1.DecryptResponse(\x01\x30\x01\x12\x66\n\x0bGetMetadata\x12).dapr.proto.runtime.v1.GetMetadataRequest\x1a*.dapr.proto.runtime.v1.GetMetadataResponse\"\x00\x12R\n\x0bSetMetadata\x12).dapr.proto.runtime.v1.SetMetadataRequest\x1a\x16.google.protobuf.Empty\"\x00\x12m\n\x12SubtleGetKeyAlpha1\x12*.dapr.proto.runtime.v1.SubtleGetKeyRequest\x1a+.dapr.proto.runtime.v1.SubtleGetKeyResponse\x12p\n\x13SubtleEncryptAlpha1\x12+.dapr.proto.runtime.v1.SubtleEncryptRequest\x1a,.dapr.proto.runtime.v1.SubtleEncryptResponse\x12p\n\x13SubtleDecryptAlpha1\x12+.dapr.proto.runtime.v1.SubtleDecryptRequest\x1a,.dapr.proto.runtime.v1.SubtleDecryptResponse\x12p\n\x13SubtleWrapKeyAlpha1\x12+.dapr.proto.runtime.v1.SubtleWrapKeyRequest\x1a,.dapr.proto.runtime.v1.SubtleWrapKeyResponse\x12v\n\x15SubtleUnwrapKeyAlpha1\x12-.dapr.proto.runtime.v1.SubtleUnwrapKeyRequest\x1a..dapr.proto.runtime.v1.SubtleUnwrapKeyResponse\x12g\n\x10SubtleSignAlpha1\x12(.dapr.proto.runtime.v1.SubtleSignRequest\x1a).dapr.proto.runtime.v1.SubtleSignResponse\x12m\n\x12SubtleVerifyAlpha1\x12*.dapr.proto.runtime.v1.SubtleVerifyRequest\x1a+.dapr.proto.runtime.v1.SubtleVerifyResponse\x12u\n\x13StartWorkflowAlpha1\x12+.dapr.proto.runtime.v1.StartWorkflowRequest\x1a,.dapr.proto.runtime.v1.StartWorkflowResponse\"\x03\x88\x02\x01\x12o\n\x11GetWorkflowAlpha1\x12).dapr.proto.runtime.v1.GetWorkflowRequest\x1a*.dapr.proto.runtime.v1.GetWorkflowResponse\"\x03\x88\x02\x01\x12_\n\x13PurgeWorkflowAlpha1\x12+.dapr.proto.runtime.v1.PurgeWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x03\x88\x02\x01\x12g\n\x17TerminateWorkflowAlpha1\x12/.dapr.proto.runtime.v1.TerminateWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x03\x88\x02\x01\x12_\n\x13PauseWorkflowAlpha1\x12+.dapr.proto.runtime.v1.PauseWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x03\x88\x02\x01\x12\x61\n\x14ResumeWorkflowAlpha1\x12,.dapr.proto.runtime.v1.ResumeWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x03\x88\x02\x01\x12i\n\x18RaiseEventWorkflowAlpha1\x12\x30.dapr.proto.runtime.v1.RaiseEventWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x03\x88\x02\x01\x12q\n\x12StartWorkflowBeta1\x12+.dapr.proto.runtime.v1.StartWorkflowRequest\x1a,.dapr.proto.runtime.v1.StartWorkflowResponse\"\x00\x12k\n\x10GetWorkflowBeta1\x12).dapr.proto.runtime.v1.GetWorkflowRequest\x1a*.dapr.proto.runtime.v1.GetWorkflowResponse\"\x00\x12[\n\x12PurgeWorkflowBeta1\x12+.dapr.proto.runtime.v1.PurgeWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x63\n\x16TerminateWorkflowBeta1\x12/.dapr.proto.runtime.v1.TerminateWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x00\x12[\n\x12PauseWorkflowBeta1\x12+.dapr.proto.runtime.v1.PauseWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x00\x12]\n\x13ResumeWorkflowBeta1\x12,.dapr.proto.runtime.v1.ResumeWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x65\n\x17RaiseEventWorkflowBeta1\x12\x30.dapr.proto.runtime.v1.RaiseEventWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x00\x12L\n\x08Shutdown\x12&.dapr.proto.runtime.v1.ShutdownRequest\x1a\x16.google.protobuf.Empty\"\x00\x12l\n\x11ScheduleJobAlpha1\x12).dapr.proto.runtime.v1.ScheduleJobRequest\x1a*.dapr.proto.runtime.v1.ScheduleJobResponse\"\x00\x12]\n\x0cGetJobAlpha1\x12$.dapr.proto.runtime.v1.GetJobRequest\x1a%.dapr.proto.runtime.v1.GetJobResponse\"\x00\x12\x66\n\x0f\x44\x65leteJobAlpha1\x12\'.dapr.proto.runtime.v1.DeleteJobRequest\x1a(.dapr.proto.runtime.v1.DeleteJobResponse\"\x00\x12\x8d\x01\n\x18\x44\x65leteJobsByPrefixAlpha1\x12\x36.dapr.proto.runtime.v1.DeleteJobsByPrefixRequestAlpha1\x1a\x37.dapr.proto.runtime.v1.DeleteJobsByPrefixResponseAlpha1\"\x00\x12o\n\x0eListJobsAlpha1\x12,.dapr.proto.runtime.v1.ListJobsRequestAlpha1\x1a-.dapr.proto.runtime.v1.ListJobsResponseAlpha1\"\x00\x12k\n\x0e\x43onverseAlpha1\x12*.dapr.proto.runtime.v1.ConversationRequest\x1a+.dapr.proto.runtime.v1.ConversationResponse\"\x00\x12w\n\x0e\x43onverseAlpha2\x12\x30.dapr.proto.runtime.v1.ConversationRequestAlpha2\x1a\x31.dapr.proto.runtime.v1.ConversationResponseAlpha2\"\x00\x42i\n\nio.dapr.v1B\nDaprProtosZ1github.com/dapr/dapr/pkg/proto/runtime/v1;runtime\xaa\x02\x1b\x44\x61pr.Client.Autogen.Grpc.v1b\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n dapr/proto/runtime/v1/dapr.proto\x12\x15\x64\x61pr.proto.runtime.v1\x1a\x1bgoogle/protobuf/empty.proto\x1a!dapr/proto/common/v1/common.proto\x1a\"dapr/proto/runtime/v1/actors.proto\x1a\"dapr/proto/runtime/v1/pubsub.proto\x1a\"dapr/proto/runtime/v1/invoke.proto\x1a!dapr/proto/runtime/v1/state.proto\x1a#dapr/proto/runtime/v1/binding.proto\x1a\"dapr/proto/runtime/v1/secret.proto\x1a$dapr/proto/runtime/v1/metadata.proto\x1a)dapr/proto/runtime/v1/configuration.proto\x1a dapr/proto/runtime/v1/lock.proto\x1a\"dapr/proto/runtime/v1/crypto.proto\x1a$dapr/proto/runtime/v1/workflow.proto\x1a dapr/proto/runtime/v1/jobs.proto\x1a\x1e\x64\x61pr/proto/runtime/v1/ai.proto\"\x11\n\x0fShutdownRequest2\xbe\x38\n\x04\x44\x61pr\x12\x64\n\rInvokeService\x12+.dapr.proto.runtime.v1.InvokeServiceRequest\x1a$.dapr.proto.common.v1.InvokeResponse\"\x00\x12]\n\x08GetState\x12&.dapr.proto.runtime.v1.GetStateRequest\x1a\'.dapr.proto.runtime.v1.GetStateResponse\"\x00\x12i\n\x0cGetBulkState\x12*.dapr.proto.runtime.v1.GetBulkStateRequest\x1a+.dapr.proto.runtime.v1.GetBulkStateResponse\"\x00\x12N\n\tSaveState\x12\'.dapr.proto.runtime.v1.SaveStateRequest\x1a\x16.google.protobuf.Empty\"\x00\x12i\n\x10QueryStateAlpha1\x12(.dapr.proto.runtime.v1.QueryStateRequest\x1a).dapr.proto.runtime.v1.QueryStateResponse\"\x00\x12R\n\x0b\x44\x65leteState\x12).dapr.proto.runtime.v1.DeleteStateRequest\x1a\x16.google.protobuf.Empty\"\x00\x12Z\n\x0f\x44\x65leteBulkState\x12-.dapr.proto.runtime.v1.DeleteBulkStateRequest\x1a\x16.google.protobuf.Empty\"\x00\x12j\n\x17\x45xecuteStateTransaction\x12\x35.dapr.proto.runtime.v1.ExecuteStateTransactionRequest\x1a\x16.google.protobuf.Empty\"\x00\x12T\n\x0cPublishEvent\x12*.dapr.proto.runtime.v1.PublishEventRequest\x1a\x16.google.protobuf.Empty\"\x00\x12t\n\x16\x42ulkPublishEventAlpha1\x12).dapr.proto.runtime.v1.BulkPublishRequest\x1a*.dapr.proto.runtime.v1.BulkPublishResponse\"\x03\x88\x02\x01\x12k\n\x10\x42ulkPublishEvent\x12).dapr.proto.runtime.v1.BulkPublishRequest\x1a*.dapr.proto.runtime.v1.BulkPublishResponse\"\x00\x12\x97\x01\n\x1aSubscribeTopicEventsAlpha1\x12\x38.dapr.proto.runtime.v1.SubscribeTopicEventsRequestAlpha1\x1a\x39.dapr.proto.runtime.v1.SubscribeTopicEventsResponseAlpha1\"\x00(\x01\x30\x01\x12l\n\rInvokeBinding\x12+.dapr.proto.runtime.v1.InvokeBindingRequest\x1a,.dapr.proto.runtime.v1.InvokeBindingResponse\"\x00\x12`\n\tGetSecret\x12\'.dapr.proto.runtime.v1.GetSecretRequest\x1a(.dapr.proto.runtime.v1.GetSecretResponse\"\x00\x12l\n\rGetBulkSecret\x12+.dapr.proto.runtime.v1.GetBulkSecretRequest\x1a,.dapr.proto.runtime.v1.GetBulkSecretResponse\"\x00\x12`\n\x12RegisterActorTimer\x12\x30.dapr.proto.runtime.v1.RegisterActorTimerRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x64\n\x14UnregisterActorTimer\x12\x32.dapr.proto.runtime.v1.UnregisterActorTimerRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x66\n\x15RegisterActorReminder\x12\x33.dapr.proto.runtime.v1.RegisterActorReminderRequest\x1a\x16.google.protobuf.Empty\"\x00\x12j\n\x17UnregisterActorReminder\x12\x35.dapr.proto.runtime.v1.UnregisterActorReminderRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x9f\x01\n\x1eUnregisterActorRemindersByType\x12<.dapr.proto.runtime.v1.UnregisterActorRemindersByTypeRequest\x1a=.dapr.proto.runtime.v1.UnregisterActorRemindersByTypeResponse\"\x00\x12{\n\x12ListActorReminders\x12\x30.dapr.proto.runtime.v1.ListActorRemindersRequest\x1a\x31.dapr.proto.runtime.v1.ListActorRemindersResponse\"\x00\x12l\n\rGetActorState\x12+.dapr.proto.runtime.v1.GetActorStateRequest\x1a,.dapr.proto.runtime.v1.GetActorStateResponse\"\x00\x12u\n\x10GetActorReminder\x12..dapr.proto.runtime.v1.GetActorReminderRequest\x1a/.dapr.proto.runtime.v1.GetActorReminderResponse\"\x00\x12t\n\x1c\x45xecuteActorStateTransaction\x12:.dapr.proto.runtime.v1.ExecuteActorStateTransactionRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x66\n\x0bInvokeActor\x12).dapr.proto.runtime.v1.InvokeActorRequest\x1a*.dapr.proto.runtime.v1.InvokeActorResponse\"\x00\x12{\n\x16GetConfigurationAlpha1\x12..dapr.proto.runtime.v1.GetConfigurationRequest\x1a/.dapr.proto.runtime.v1.GetConfigurationResponse\"\x00\x12u\n\x10GetConfiguration\x12..dapr.proto.runtime.v1.GetConfigurationRequest\x1a/.dapr.proto.runtime.v1.GetConfigurationResponse\"\x00\x12\x8f\x01\n\x1cSubscribeConfigurationAlpha1\x12\x34.dapr.proto.runtime.v1.SubscribeConfigurationRequest\x1a\x35.dapr.proto.runtime.v1.SubscribeConfigurationResponse\"\x00\x30\x01\x12\x89\x01\n\x16SubscribeConfiguration\x12\x34.dapr.proto.runtime.v1.SubscribeConfigurationRequest\x1a\x35.dapr.proto.runtime.v1.SubscribeConfigurationResponse\"\x00\x30\x01\x12\x93\x01\n\x1eUnsubscribeConfigurationAlpha1\x12\x36.dapr.proto.runtime.v1.UnsubscribeConfigurationRequest\x1a\x37.dapr.proto.runtime.v1.UnsubscribeConfigurationResponse\"\x00\x12\x8d\x01\n\x18UnsubscribeConfiguration\x12\x36.dapr.proto.runtime.v1.UnsubscribeConfigurationRequest\x1a\x37.dapr.proto.runtime.v1.UnsubscribeConfigurationResponse\"\x00\x12`\n\rTryLockAlpha1\x12%.dapr.proto.runtime.v1.TryLockRequest\x1a&.dapr.proto.runtime.v1.TryLockResponse\"\x00\x12]\n\x0cUnlockAlpha1\x12$.dapr.proto.runtime.v1.UnlockRequest\x1a%.dapr.proto.runtime.v1.UnlockResponse\"\x00\x12\x62\n\rEncryptAlpha1\x12%.dapr.proto.runtime.v1.EncryptRequest\x1a&.dapr.proto.runtime.v1.EncryptResponse(\x01\x30\x01\x12\x62\n\rDecryptAlpha1\x12%.dapr.proto.runtime.v1.DecryptRequest\x1a&.dapr.proto.runtime.v1.DecryptResponse(\x01\x30\x01\x12\x66\n\x0bGetMetadata\x12).dapr.proto.runtime.v1.GetMetadataRequest\x1a*.dapr.proto.runtime.v1.GetMetadataResponse\"\x00\x12R\n\x0bSetMetadata\x12).dapr.proto.runtime.v1.SetMetadataRequest\x1a\x16.google.protobuf.Empty\"\x00\x12m\n\x12SubtleGetKeyAlpha1\x12*.dapr.proto.runtime.v1.SubtleGetKeyRequest\x1a+.dapr.proto.runtime.v1.SubtleGetKeyResponse\x12p\n\x13SubtleEncryptAlpha1\x12+.dapr.proto.runtime.v1.SubtleEncryptRequest\x1a,.dapr.proto.runtime.v1.SubtleEncryptResponse\x12p\n\x13SubtleDecryptAlpha1\x12+.dapr.proto.runtime.v1.SubtleDecryptRequest\x1a,.dapr.proto.runtime.v1.SubtleDecryptResponse\x12p\n\x13SubtleWrapKeyAlpha1\x12+.dapr.proto.runtime.v1.SubtleWrapKeyRequest\x1a,.dapr.proto.runtime.v1.SubtleWrapKeyResponse\x12v\n\x15SubtleUnwrapKeyAlpha1\x12-.dapr.proto.runtime.v1.SubtleUnwrapKeyRequest\x1a..dapr.proto.runtime.v1.SubtleUnwrapKeyResponse\x12g\n\x10SubtleSignAlpha1\x12(.dapr.proto.runtime.v1.SubtleSignRequest\x1a).dapr.proto.runtime.v1.SubtleSignResponse\x12m\n\x12SubtleVerifyAlpha1\x12*.dapr.proto.runtime.v1.SubtleVerifyRequest\x1a+.dapr.proto.runtime.v1.SubtleVerifyResponse\x12u\n\x13StartWorkflowAlpha1\x12+.dapr.proto.runtime.v1.StartWorkflowRequest\x1a,.dapr.proto.runtime.v1.StartWorkflowResponse\"\x03\x88\x02\x01\x12o\n\x11GetWorkflowAlpha1\x12).dapr.proto.runtime.v1.GetWorkflowRequest\x1a*.dapr.proto.runtime.v1.GetWorkflowResponse\"\x03\x88\x02\x01\x12_\n\x13PurgeWorkflowAlpha1\x12+.dapr.proto.runtime.v1.PurgeWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x03\x88\x02\x01\x12g\n\x17TerminateWorkflowAlpha1\x12/.dapr.proto.runtime.v1.TerminateWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x03\x88\x02\x01\x12_\n\x13PauseWorkflowAlpha1\x12+.dapr.proto.runtime.v1.PauseWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x03\x88\x02\x01\x12\x61\n\x14ResumeWorkflowAlpha1\x12,.dapr.proto.runtime.v1.ResumeWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x03\x88\x02\x01\x12i\n\x18RaiseEventWorkflowAlpha1\x12\x30.dapr.proto.runtime.v1.RaiseEventWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x03\x88\x02\x01\x12q\n\x12StartWorkflowBeta1\x12+.dapr.proto.runtime.v1.StartWorkflowRequest\x1a,.dapr.proto.runtime.v1.StartWorkflowResponse\"\x00\x12k\n\x10GetWorkflowBeta1\x12).dapr.proto.runtime.v1.GetWorkflowRequest\x1a*.dapr.proto.runtime.v1.GetWorkflowResponse\"\x00\x12[\n\x12PurgeWorkflowBeta1\x12+.dapr.proto.runtime.v1.PurgeWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x63\n\x16TerminateWorkflowBeta1\x12/.dapr.proto.runtime.v1.TerminateWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x00\x12[\n\x12PauseWorkflowBeta1\x12+.dapr.proto.runtime.v1.PauseWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x00\x12]\n\x13ResumeWorkflowBeta1\x12,.dapr.proto.runtime.v1.ResumeWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x65\n\x17RaiseEventWorkflowBeta1\x12\x30.dapr.proto.runtime.v1.RaiseEventWorkflowRequest\x1a\x16.google.protobuf.Empty\"\x00\x12L\n\x08Shutdown\x12&.dapr.proto.runtime.v1.ShutdownRequest\x1a\x16.google.protobuf.Empty\"\x00\x12l\n\x11ScheduleJobAlpha1\x12).dapr.proto.runtime.v1.ScheduleJobRequest\x1a*.dapr.proto.runtime.v1.ScheduleJobResponse\"\x00\x12]\n\x0cGetJobAlpha1\x12$.dapr.proto.runtime.v1.GetJobRequest\x1a%.dapr.proto.runtime.v1.GetJobResponse\"\x00\x12\x66\n\x0f\x44\x65leteJobAlpha1\x12\'.dapr.proto.runtime.v1.DeleteJobRequest\x1a(.dapr.proto.runtime.v1.DeleteJobResponse\"\x00\x12\x8d\x01\n\x18\x44\x65leteJobsByPrefixAlpha1\x12\x36.dapr.proto.runtime.v1.DeleteJobsByPrefixRequestAlpha1\x1a\x37.dapr.proto.runtime.v1.DeleteJobsByPrefixResponseAlpha1\"\x00\x12o\n\x0eListJobsAlpha1\x12,.dapr.proto.runtime.v1.ListJobsRequestAlpha1\x1a-.dapr.proto.runtime.v1.ListJobsResponseAlpha1\"\x00\x12k\n\x0e\x43onverseAlpha1\x12*.dapr.proto.runtime.v1.ConversationRequest\x1a+.dapr.proto.runtime.v1.ConversationResponse\"\x00\x12w\n\x0e\x43onverseAlpha2\x12\x30.dapr.proto.runtime.v1.ConversationRequestAlpha2\x1a\x31.dapr.proto.runtime.v1.ConversationResponseAlpha2\"\x00\x42i\n\nio.dapr.v1B\nDaprProtosZ1github.com/dapr/dapr/pkg/proto/runtime/v1;runtime\xaa\x02\x1b\x44\x61pr.Client.Autogen.Grpc.v1b\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -47,6 +47,8 @@ if not _descriptor._USE_C_DESCRIPTORS: _globals['DESCRIPTOR']._loaded_options = None _globals['DESCRIPTOR']._serialized_options = b'\n\nio.dapr.v1B\nDaprProtosZ1github.com/dapr/dapr/pkg/proto/runtime/v1;runtime\252\002\033Dapr.Client.Autogen.Grpc.v1' + _globals['_DAPR'].methods_by_name['BulkPublishEventAlpha1']._loaded_options = None + _globals['_DAPR'].methods_by_name['BulkPublishEventAlpha1']._serialized_options = b'\210\002\001' _globals['_DAPR'].methods_by_name['StartWorkflowAlpha1']._loaded_options = None _globals['_DAPR'].methods_by_name['StartWorkflowAlpha1']._serialized_options = b'\210\002\001' _globals['_DAPR'].methods_by_name['GetWorkflowAlpha1']._loaded_options = None @@ -64,5 +66,5 @@ _globals['_SHUTDOWNREQUEST']._serialized_start=594 _globals['_SHUTDOWNREQUEST']._serialized_end=611 _globals['_DAPR']._serialized_start=614 - _globals['_DAPR']._serialized_end=7732 + _globals['_DAPR']._serialized_end=7844 # @@protoc_insertion_point(module_scope) diff --git a/dapr/proto/runtime/v1/dapr_pb2_grpc.py b/dapr/proto/runtime/v1/dapr_pb2_grpc.py index 5d9cc0c95..803556190 100644 --- a/dapr/proto/runtime/v1/dapr_pb2_grpc.py +++ b/dapr/proto/runtime/v1/dapr_pb2_grpc.py @@ -100,6 +100,11 @@ def __init__(self, channel): request_serializer=dapr_dot_proto_dot_runtime_dot_v1_dot_pubsub__pb2.BulkPublishRequest.SerializeToString, response_deserializer=dapr_dot_proto_dot_runtime_dot_v1_dot_pubsub__pb2.BulkPublishResponse.FromString, _registered_method=True) + self.BulkPublishEvent = channel.unary_unary( + '/dapr.proto.runtime.v1.Dapr/BulkPublishEvent', + request_serializer=dapr_dot_proto_dot_runtime_dot_v1_dot_pubsub__pb2.BulkPublishRequest.SerializeToString, + response_deserializer=dapr_dot_proto_dot_runtime_dot_v1_dot_pubsub__pb2.BulkPublishResponse.FromString, + _registered_method=True) self.SubscribeTopicEventsAlpha1 = channel.stream_stream( '/dapr.proto.runtime.v1.Dapr/SubscribeTopicEventsAlpha1', request_serializer=dapr_dot_proto_dot_runtime_dot_v1_dot_pubsub__pb2.SubscribeTopicEventsRequestAlpha1.SerializeToString, @@ -446,6 +451,13 @@ def PublishEvent(self, request, context): raise NotImplementedError('Method not implemented!') def BulkPublishEventAlpha1(self, request, context): + """Deprecated: Bulk Publishes multiple events to the specified topic. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def BulkPublishEvent(self, request, context): """Bulk Publishes multiple events to the specified topic. """ context.set_code(grpc.StatusCode.UNIMPLEMENTED) @@ -887,6 +899,11 @@ def add_DaprServicer_to_server(servicer, server): request_deserializer=dapr_dot_proto_dot_runtime_dot_v1_dot_pubsub__pb2.BulkPublishRequest.FromString, response_serializer=dapr_dot_proto_dot_runtime_dot_v1_dot_pubsub__pb2.BulkPublishResponse.SerializeToString, ), + 'BulkPublishEvent': grpc.unary_unary_rpc_method_handler( + servicer.BulkPublishEvent, + request_deserializer=dapr_dot_proto_dot_runtime_dot_v1_dot_pubsub__pb2.BulkPublishRequest.FromString, + response_serializer=dapr_dot_proto_dot_runtime_dot_v1_dot_pubsub__pb2.BulkPublishResponse.SerializeToString, + ), 'SubscribeTopicEventsAlpha1': grpc.stream_stream_rpc_method_handler( servicer.SubscribeTopicEventsAlpha1, request_deserializer=dapr_dot_proto_dot_runtime_dot_v1_dot_pubsub__pb2.SubscribeTopicEventsRequestAlpha1.FromString, @@ -1444,6 +1461,33 @@ def BulkPublishEventAlpha1(request, metadata, _registered_method=True) + @staticmethod + def BulkPublishEvent(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/dapr.proto.runtime.v1.Dapr/BulkPublishEvent', + dapr_dot_proto_dot_runtime_dot_v1_dot_pubsub__pb2.BulkPublishRequest.SerializeToString, + dapr_dot_proto_dot_runtime_dot_v1_dot_pubsub__pb2.BulkPublishResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + @staticmethod def SubscribeTopicEventsAlpha1(request_iterator, target, diff --git a/tests/clients/test_conversation.py b/tests/clients/test_conversation.py index 0aae98b4f..50767e8e7 100644 --- a/tests/clients/test_conversation.py +++ b/tests/clients/test_conversation.py @@ -17,7 +17,9 @@ import json import unittest import uuid +from unittest.mock import Mock, patch +from google.protobuf.struct_pb2 import Struct from google.rpc import code_pb2, status_pb2 from dapr.aio.clients import DaprClient as AsyncDaprClient @@ -1252,6 +1254,51 @@ def test_get_outputs_from_grpc_response_without_model_usage(self): self.assertEqual(out.choices[0].message.content, 'Echo') +class ConverseAlpha2ResponseFormatTests(unittest.TestCase): + """Unit tests for converse_alpha2 response_format parameter.""" + + def test_converse_alpha2_passes_response_format_on_request(self): + """converse_alpha2 sets response_format on the gRPC request when provided.""" + user_message = create_user_message('Structured output please') + input_alpha2 = ConversationInputAlpha2(messages=[user_message]) + response_format = Struct() + response_format.update({'type': 'json_schema', 'json_schema': {'name': 'test', 'schema': {}}}) + + captured_requests = [] + mock_choice_msg = Mock() + mock_choice_msg.content = 'ok' + mock_choice_msg.tool_calls = [] + mock_choice = Mock() + mock_choice.finish_reason = 'stop' + mock_choice.index = 0 + mock_choice.message = mock_choice_msg + mock_output = Mock() + mock_output.choices = [mock_choice] + mock_response = Mock() + mock_response.outputs = [mock_output] + mock_response.context_id = '' + mock_call = Mock() + + def capture_run_rpc(rpc, request, *args, **kwargs): + captured_requests.append(request) + return (mock_response, mock_call) + + with patch('dapr.clients.health.DaprHealth.wait_for_sidecar'): + client = DaprClient('localhost:50011') + with patch.object(client.retry_policy, 'run_rpc', side_effect=capture_run_rpc): + client.converse_alpha2( + name='test-llm', + inputs=[input_alpha2], + response_format=response_format, + ) + + self.assertEqual(len(captured_requests), 1) + req = captured_requests[0] + self.assertTrue(hasattr(req, 'response_format')) + self.assertEqual(req.response_format['type'], 'json_schema') + self.assertEqual(req.response_format['json_schema']['name'], 'test') + + class ExecuteRegisteredToolSyncTests(unittest.TestCase): def tearDown(self): # Cleanup all tools we may have registered by name prefix From faaaae0ffaa85fbbcc4e29ed39575a945c4ed601 Mon Sep 17 00:00:00 2001 From: Samantha Coyle Date: Tue, 3 Feb 2026 09:45:10 -0600 Subject: [PATCH 3/4] style: appease linter Signed-off-by: Samantha Coyle --- tests/clients/test_conversation.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/clients/test_conversation.py b/tests/clients/test_conversation.py index 50767e8e7..105c7b291 100644 --- a/tests/clients/test_conversation.py +++ b/tests/clients/test_conversation.py @@ -1262,7 +1262,9 @@ def test_converse_alpha2_passes_response_format_on_request(self): user_message = create_user_message('Structured output please') input_alpha2 = ConversationInputAlpha2(messages=[user_message]) response_format = Struct() - response_format.update({'type': 'json_schema', 'json_schema': {'name': 'test', 'schema': {}}}) + response_format.update( + {'type': 'json_schema', 'json_schema': {'name': 'test', 'schema': {}}} + ) captured_requests = [] mock_choice_msg = Mock() From 22d12c8520adee6de6c7896fa867dc1bb657b124 Mon Sep 17 00:00:00 2001 From: Samantha Coyle Date: Tue, 3 Feb 2026 10:48:30 -0600 Subject: [PATCH 4/4] style: tox -e type fixes Signed-off-by: Samantha Coyle --- dapr/clients/grpc/conversation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dapr/clients/grpc/conversation.py b/dapr/clients/grpc/conversation.py index bfd314f0e..8fc3db067 100644 --- a/dapr/clients/grpc/conversation.py +++ b/dapr/clients/grpc/conversation.py @@ -694,7 +694,7 @@ def _get_outputs_from_grpc_response( model: Optional[str] = None usage: Optional[ConversationResultAlpha2CompletionUsage] = None - if hasattr(output, 'model') and getattr(output, 'model', ''): + if hasattr(output, 'model') and getattr(output, 'model', None): model = output.model if hasattr(output, 'usage') and output.usage: u = output.usage