1use crate::app::{AgentToolRef, OperationAnnotations, RequestContext, SubjectContext};
6use crate::codec::agent::{
7 from_wire_agent_interaction, from_wire_agent_provider_capabilities, from_wire_agent_session,
8 from_wire_agent_turn, from_wire_list_agent_provider_interactions_response,
9 from_wire_list_agent_provider_sessions_response,
10 from_wire_list_agent_provider_turn_events_response,
11 from_wire_list_agent_provider_turns_response, to_wire_cancel_agent_provider_turn_request,
12 to_wire_create_agent_provider_session_request, to_wire_create_agent_provider_turn_request,
13 to_wire_get_agent_provider_capabilities_request,
14 to_wire_get_agent_provider_interaction_request, to_wire_get_agent_provider_session_request,
15 to_wire_get_agent_provider_turn_request, to_wire_list_agent_provider_interactions_request,
16 to_wire_list_agent_provider_sessions_request, to_wire_list_agent_provider_turn_events_request,
17 to_wire_list_agent_provider_turns_request, to_wire_resolve_agent_provider_interaction_request,
18 to_wire_update_agent_provider_session_request,
19};
20use crate::codec::host_service::{HostServiceChannel, connect_host_service, plain_channel};
21use crate::generated::v1;
22use crate::rpc_support::GestaltError;
23
24pub type AgentExecutionStatus = i32;
26
27pub mod agent_execution_status {
29 pub const AGENT_EXECUTION_STATUS_UNSPECIFIED: i32 = 0;
31 pub const AGENT_EXECUTION_STATUS_PENDING: i32 = 1;
33 pub const AGENT_EXECUTION_STATUS_RUNNING: i32 = 2;
35 pub const AGENT_EXECUTION_STATUS_SUCCEEDED: i32 = 3;
37 pub const AGENT_EXECUTION_STATUS_FAILED: i32 = 4;
39 pub const AGENT_EXECUTION_STATUS_CANCELED: i32 = 5;
41 pub const AGENT_EXECUTION_STATUS_WAITING_FOR_INPUT: i32 = 6;
43}
44
45pub type AgentInteractionState = i32;
47
48pub mod agent_interaction_state {
50 pub const AGENT_INTERACTION_STATE_UNSPECIFIED: i32 = 0;
52 pub const AGENT_INTERACTION_STATE_PENDING: i32 = 1;
54 pub const AGENT_INTERACTION_STATE_RESOLVED: i32 = 2;
56 pub const AGENT_INTERACTION_STATE_CANCELED: i32 = 3;
58}
59
60pub type AgentInteractionType = i32;
62
63pub mod agent_interaction_type {
65 pub const AGENT_INTERACTION_TYPE_UNSPECIFIED: i32 = 0;
67 pub const AGENT_INTERACTION_TYPE_APPROVAL: i32 = 1;
69 pub const AGENT_INTERACTION_TYPE_CLARIFICATION: i32 = 2;
71 pub const AGENT_INTERACTION_TYPE_INPUT: i32 = 3;
73}
74
75pub type AgentMessagePartType = i32;
77
78pub mod agent_message_part_type {
80 pub const AGENT_MESSAGE_PART_TYPE_UNSPECIFIED: i32 = 0;
82 pub const AGENT_MESSAGE_PART_TYPE_TEXT: i32 = 1;
84 pub const AGENT_MESSAGE_PART_TYPE_JSON: i32 = 2;
86 pub const AGENT_MESSAGE_PART_TYPE_TOOL_CALL: i32 = 3;
88 pub const AGENT_MESSAGE_PART_TYPE_TOOL_RESULT: i32 = 4;
90 pub const AGENT_MESSAGE_PART_TYPE_IMAGE_REF: i32 = 5;
92}
93
94pub type AgentSessionState = i32;
96
97pub mod agent_session_state {
99 pub const AGENT_SESSION_STATE_UNSPECIFIED: i32 = 0;
101 pub const AGENT_SESSION_STATE_ACTIVE: i32 = 1;
103 pub const AGENT_SESSION_STATE_ARCHIVED: i32 = 2;
105}
106
107pub type AgentToolSourceMode = i32;
109
110pub mod agent_tool_source_mode {
112 pub const AGENT_TOOL_SOURCE_MODE_UNSPECIFIED: i32 = 0;
114 pub const AGENT_TOOL_SOURCE_MODE_CATALOG: i32 = 2;
116 pub const AGENT_TOOL_SOURCE_MODE_NONE: i32 = 3;
118}
119
120#[derive(Clone, Debug, Default, PartialEq)]
122pub struct AgentCatalogToolConfig {
123 pub refs: Vec<AgentToolRef>,
125 pub tools: Vec<ListedAgentTool>,
127}
128
129#[derive(Clone, Debug, Default, PartialEq)]
131pub struct AgentInteraction {
132 pub id: String,
134 pub r#type: AgentInteractionType,
136 pub state: AgentInteractionState,
138 pub title: String,
140 pub prompt: String,
142 pub request: Option<serde_json::Map<String, serde_json::Value>>,
144 pub resolution: Option<serde_json::Map<String, serde_json::Value>>,
146 pub created_at: Option<std::time::SystemTime>,
148 pub resolved_at: Option<std::time::SystemTime>,
150 pub turn_id: String,
152 pub session_id: String,
154}
155
156#[derive(Clone, Debug, Default, PartialEq)]
158pub struct AgentMessage {
159 pub role: String,
161 pub text: String,
163 pub parts: Vec<AgentMessagePart>,
165 pub metadata: Option<serde_json::Map<String, serde_json::Value>>,
167}
168
169#[derive(Clone, Debug, Default, PartialEq)]
171pub struct AgentMessagePart {
172 pub r#type: AgentMessagePartType,
174 pub text: String,
176 pub json: Option<serde_json::Map<String, serde_json::Value>>,
178 pub tool_call: Option<AgentMessagePartToolCall>,
180 pub tool_result: Option<AgentMessagePartToolResult>,
182 pub image_ref: Option<AgentMessagePartImageRef>,
184}
185
186#[derive(Clone, Debug, Default, PartialEq)]
188pub struct AgentMessagePartImageRef {
189 pub uri: String,
191 pub mime_type: String,
193}
194
195#[derive(Clone, Debug, Default, PartialEq)]
197pub struct AgentMessagePartToolCall {
198 pub id: String,
200 pub tool_id: String,
202 pub arguments: Option<serde_json::Map<String, serde_json::Value>>,
204}
205
206#[derive(Clone, Debug, Default, PartialEq)]
208pub struct AgentMessagePartToolResult {
209 pub tool_call_id: String,
211 pub status: i32,
213 pub content: String,
215 pub output: Option<serde_json::Map<String, serde_json::Value>>,
217}
218
219#[derive(Clone, Debug, Default, PartialEq)]
221pub struct AgentNoTools {}
222
223#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
225#[derive(Clone, Debug, PartialEq)]
226pub enum AgentOutputKind {
227 Text(AgentTextOutput),
229 Structured(AgentStructuredOutput),
231}
232
233#[derive(Clone, Debug, Default, PartialEq)]
235pub struct AgentOutput {
236 pub kind: Option<AgentOutputKind>,
238}
239
240#[derive(Clone, Debug, Default, PartialEq)]
242pub struct AgentProviderCapabilities {
243 pub streaming_text: bool,
245 pub tool_calls: bool,
247 pub parallel_tool_calls: bool,
249 pub interactions: bool,
251 pub resumable_turns: bool,
253 pub reasoning_summaries: bool,
255 pub bounded_list_hydration: bool,
261 pub supported_tool_sources: Vec<AgentToolSourceMode>,
263 pub supports_session_start: bool,
265 pub supports_prepared_workspace: bool,
267}
268
269#[derive(Clone, Debug, Default, PartialEq)]
271pub struct AgentSession {
272 pub id: String,
274 pub provider_name: String,
276 pub model: String,
278 pub client_ref: String,
280 pub state: AgentSessionState,
282 pub metadata: Option<serde_json::Map<String, serde_json::Value>>,
284 pub created_by_subject_id: String,
286 pub created_at: Option<std::time::SystemTime>,
288 pub updated_at: Option<std::time::SystemTime>,
290 pub last_turn_at: Option<std::time::SystemTime>,
292}
293
294#[derive(Clone, Debug, Default, PartialEq)]
296pub struct AgentSessionStartConfig {
297 pub hooks: Vec<AgentSessionStartHook>,
299}
300
301#[derive(Clone, Debug, Default, PartialEq)]
303pub struct AgentSessionStartHook {
304 pub id: String,
306 pub r#type: String,
308 pub command: Vec<String>,
310 pub cwd: String,
312 pub timeout: String,
314 pub env: std::collections::BTreeMap<String, String>,
316 pub output: Option<AgentSessionStartHookOutput>,
318}
319
320#[derive(Clone, Debug, Default, PartialEq)]
322pub struct AgentSessionStartHookOutput {
323 pub additional_context: bool,
325 pub metadata: bool,
327}
328
329#[derive(Clone, Debug, Default, PartialEq)]
331pub struct AgentStructuredOutput {
332 pub schema: Option<serde_json::Map<String, serde_json::Value>>,
334}
335
336#[derive(Clone, Debug, Default, PartialEq)]
338pub struct AgentTextOutput {}
339
340#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
342#[derive(Clone, Debug, PartialEq)]
343pub enum AgentToolConfigSource {
344 None(AgentNoTools),
346 Catalog(AgentCatalogToolConfig),
348}
349
350#[derive(Clone, Debug, Default, PartialEq)]
352pub struct AgentToolConfig {
353 pub source: Option<AgentToolConfigSource>,
355}
356
357#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
359#[derive(Clone, Debug, PartialEq)]
360pub enum AgentTurnOutput {
361 Text(AgentTurnTextOutput),
363 Structured(AgentTurnStructuredOutput),
365}
366
367#[derive(Clone, Debug, Default, PartialEq)]
369pub struct AgentTurn {
370 pub id: String,
372 pub session_id: String,
374 pub provider_name: String,
376 pub model: String,
378 pub status: AgentExecutionStatus,
380 pub messages: Vec<AgentMessage>,
382 pub status_message: String,
384 pub created_by_subject_id: String,
386 pub created_at: Option<std::time::SystemTime>,
388 pub started_at: Option<std::time::SystemTime>,
390 pub completed_at: Option<std::time::SystemTime>,
392 pub execution_ref: String,
394 pub output: Option<AgentTurnOutput>,
396}
397
398#[derive(Clone, Debug, Default, PartialEq)]
400pub struct AgentTurnDisplay {
401 pub kind: String,
403 pub phase: String,
405 pub text: String,
407 pub label: String,
409 pub r#ref: String,
411 pub parent_ref: String,
413 pub input: Option<serde_json::Value>,
415 pub output: Option<serde_json::Value>,
417 pub error: Option<serde_json::Value>,
419 pub action: String,
421 pub format: String,
423 pub language: String,
425}
426
427#[derive(Clone, Debug, Default, PartialEq)]
429pub struct AgentTurnEvent {
430 pub id: String,
432 pub turn_id: String,
434 pub seq: i64,
436 pub r#type: String,
438 pub source: String,
440 pub visibility: String,
442 pub data: Option<serde_json::Map<String, serde_json::Value>>,
444 pub created_at: Option<std::time::SystemTime>,
446 pub display: Option<AgentTurnDisplay>,
448}
449
450#[derive(Clone, Debug, Default, PartialEq)]
452pub struct AgentTurnStructuredOutput {
453 pub text: String,
455 pub value: Option<serde_json::Map<String, serde_json::Value>>,
457}
458
459#[derive(Clone, Debug, Default, PartialEq)]
461pub struct AgentTurnTextOutput {
462 pub text: String,
464}
465
466#[derive(Clone, Debug, Default, PartialEq)]
468pub struct AgentWorkspace {
469 pub checkouts: Vec<AgentWorkspaceGitCheckout>,
471 pub cwd: String,
473}
474
475#[derive(Clone, Debug, Default, PartialEq)]
477pub struct AgentWorkspaceGitCheckout {
478 pub url: String,
480 pub r#ref: String,
482 pub path: String,
484}
485
486#[derive(Clone, Debug, Default, PartialEq)]
488pub struct CancelAgentProviderTurnRequest {
489 pub turn_id: String,
491 pub reason: String,
493 pub subject: Option<SubjectContext>,
495 pub context: Option<RequestContext>,
497 pub provider_name: String,
499}
500
501#[derive(Clone, Debug, Default, PartialEq)]
503pub struct CreateAgentProviderSessionRequest {
504 pub idempotency_key: String,
511 pub model: String,
513 pub client_ref: String,
515 pub metadata: Option<serde_json::Map<String, serde_json::Value>>,
517 pub created_by_subject_id: String,
519 pub subject: Option<SubjectContext>,
521 pub session_start: Option<AgentSessionStartConfig>,
523 pub prepared_workspace: Option<PreparedAgentWorkspace>,
525 pub provider_name: String,
527 pub workspace: Option<AgentWorkspace>,
529 pub context: Option<RequestContext>,
531 pub tools: Option<AgentToolConfig>,
533}
534
535#[derive(Clone, Debug, Default, PartialEq)]
537pub struct CreateAgentProviderTurnRequest {
538 pub turn_id: String,
540 pub session_id: String,
542 pub idempotency_key: String,
544 pub model: String,
546 pub messages: Vec<AgentMessage>,
548 pub metadata: Option<serde_json::Map<String, serde_json::Value>>,
550 pub created_by_subject_id: String,
552 pub execution_ref: String,
554 pub subject: Option<SubjectContext>,
556 pub model_options: Option<serde_json::Map<String, serde_json::Value>>,
558 pub timeout_seconds: i32,
564 pub output: Option<AgentOutput>,
566 pub context: Option<RequestContext>,
568 pub provider_name: String,
570}
571
572#[derive(Clone, Debug, Default, PartialEq)]
574pub struct GetAgentProviderCapabilitiesRequest {}
575
576#[derive(Clone, Debug, Default, PartialEq)]
578pub struct GetAgentProviderInteractionRequest {
579 pub interaction_id: String,
581 pub subject: Option<SubjectContext>,
583 pub context: Option<RequestContext>,
585}
586
587#[derive(Clone, Debug, Default, PartialEq)]
589pub struct GetAgentProviderSessionRequest {
590 pub session_id: String,
592 pub subject: Option<SubjectContext>,
594 pub context: Option<RequestContext>,
596 pub provider_name: String,
598}
599
600#[derive(Clone, Debug, Default, PartialEq)]
602pub struct GetAgentProviderTurnRequest {
603 pub turn_id: String,
605 pub subject: Option<SubjectContext>,
607 pub context: Option<RequestContext>,
609 pub provider_name: String,
611}
612
613#[derive(Clone, Debug, Default, PartialEq)]
615pub struct ListAgentProviderInteractionsRequest {
616 pub turn_id: String,
618 pub subject: Option<SubjectContext>,
620 pub context: Option<RequestContext>,
622 pub provider_name: String,
624}
625
626#[derive(Clone, Debug, Default, PartialEq)]
628pub struct ListAgentProviderInteractionsResponse {
629 pub interactions: Vec<AgentInteraction>,
631}
632
633#[derive(Clone, Debug, Default, PartialEq)]
635pub struct ListAgentProviderSessionsRequest {
636 pub subject: Option<SubjectContext>,
638 pub session_ids: Vec<String>,
640 pub state: AgentSessionState,
642 pub limit: i32,
647 pub summary_only: bool,
652 pub provider_name: String,
654 pub context: Option<RequestContext>,
656}
657
658#[derive(Clone, Debug, Default, PartialEq)]
660pub struct ListAgentProviderSessionsResponse {
661 pub sessions: Vec<AgentSession>,
663}
664
665#[derive(Clone, Debug, Default, PartialEq)]
667pub struct ListAgentProviderTurnEventsRequest {
668 pub turn_id: String,
670 pub after_seq: i64,
672 pub limit: i32,
674 pub subject: Option<SubjectContext>,
676 pub context: Option<RequestContext>,
678 pub provider_name: String,
680}
681
682#[derive(Clone, Debug, Default, PartialEq)]
684pub struct ListAgentProviderTurnEventsResponse {
685 pub events: Vec<AgentTurnEvent>,
687}
688
689#[derive(Clone, Debug, Default, PartialEq)]
691pub struct ListAgentProviderTurnsRequest {
692 pub session_id: String,
694 pub subject: Option<SubjectContext>,
696 pub turn_ids: Vec<String>,
698 pub status: AgentExecutionStatus,
700 pub limit: i32,
705 pub summary_only: bool,
711 pub context: Option<RequestContext>,
713 pub provider_name: String,
715}
716
717#[derive(Clone, Debug, Default, PartialEq)]
719pub struct ListAgentProviderTurnsResponse {
720 pub turns: Vec<AgentTurn>,
722}
723
724#[derive(Clone, Debug, Default, PartialEq)]
726pub struct ListedAgentTool {
727 pub id: String,
729 pub mcp_name: String,
731 pub title: String,
733 pub description: String,
735 pub input_schema: String,
737 pub output_schema: String,
739 pub annotations: Option<OperationAnnotations>,
741 pub r#ref: Option<AgentToolRef>,
743 pub tags: Vec<String>,
745 pub search_text: String,
747}
748
749#[derive(Clone, Debug, Default, PartialEq)]
751pub struct PreparedAgentWorkspace {
752 pub root: String,
754 pub cwd: String,
756}
757
758#[derive(Clone, Debug, Default, PartialEq)]
760pub struct ResolveAgentProviderInteractionRequest {
761 pub interaction_id: String,
763 pub resolution: Option<serde_json::Map<String, serde_json::Value>>,
765 pub subject: Option<SubjectContext>,
767 pub turn_id: String,
769 pub context: Option<RequestContext>,
771 pub provider_name: String,
773}
774
775#[derive(Clone, Debug, Default, PartialEq)]
777pub struct UpdateAgentProviderSessionRequest {
778 pub session_id: String,
780 pub client_ref: String,
782 pub state: AgentSessionState,
784 pub metadata: Option<serde_json::Map<String, serde_json::Value>>,
786 pub subject: Option<SubjectContext>,
788 pub context: Option<RequestContext>,
790 pub provider_name: String,
792}
793
794pub struct Agent {
801 inner: v1::agent_client::AgentClient<HostServiceChannel>,
802 timeout: Option<std::time::Duration>,
803 context: Option<RequestContext>,
804}
805
806impl Agent {
807 pub fn new(channel: tonic::transport::Channel) -> Self {
809 Self {
810 inner: v1::agent_client::AgentClient::new(plain_channel(channel)),
811 timeout: None,
812 context: None,
813 }
814 }
815
816 pub fn with_timeout(mut self, timeout: std::time::Duration) -> Self {
819 self.timeout = Some(timeout);
820 self
821 }
822
823 pub fn with_context(mut self, context: RequestContext) -> Self {
826 self.context = Some(context);
827 self
828 }
829
830 pub async fn connect() -> Result<Self, GestaltError> {
832 Self::connect_named("").await
833 }
834
835 pub async fn connect_named(name: &str) -> Result<Self, GestaltError> {
837 Ok(Self {
838 inner: v1::agent_client::AgentClient::new(connect_host_service("agent", name).await?),
839 timeout: None,
840 context: None,
841 })
842 }
843
844 pub async fn create_session(
846 &mut self,
847 idempotency_key: String,
848 model: String,
849 options: AgentCreateSessionOptions,
850 ) -> Result<AgentSession, GestaltError> {
851 let request = CreateAgentProviderSessionRequest {
852 idempotency_key,
853 model,
854 provider_name: options.provider_name,
855 client_ref: options.client_ref,
856 metadata: options.metadata,
857 workspace: options.workspace,
858 tools: options.tools,
859 context: self.context.clone(),
860 ..Default::default()
861 };
862 let mut tonic_request =
863 tonic::Request::new(to_wire_create_agent_provider_session_request(request));
864 if let Some(timeout) = self.timeout {
865 tonic_request.set_timeout(timeout);
866 }
867 let response = self.inner.create_session(tonic_request).await?;
868 Ok(from_wire_agent_session(response.into_inner()))
869 }
870
871 pub async fn create_session_raw(
873 &mut self,
874 request: CreateAgentProviderSessionRequest,
875 ) -> Result<AgentSession, GestaltError> {
876 let mut request = request;
877 if request.context.is_none() {
878 request.context = self.context.clone();
879 }
880 let mut tonic_request =
881 tonic::Request::new(to_wire_create_agent_provider_session_request(request));
882 if let Some(timeout) = self.timeout {
883 tonic_request.set_timeout(timeout);
884 }
885 let response = self.inner.create_session(tonic_request).await?;
886 Ok(from_wire_agent_session(response.into_inner()))
887 }
888
889 pub async fn get_session(
891 &mut self,
892 session_id: String,
893 options: AgentGetSessionOptions,
894 ) -> Result<AgentSession, GestaltError> {
895 let request = GetAgentProviderSessionRequest {
896 session_id,
897 provider_name: options.provider_name,
898 context: self.context.clone(),
899 ..Default::default()
900 };
901 let mut tonic_request =
902 tonic::Request::new(to_wire_get_agent_provider_session_request(request));
903 if let Some(timeout) = self.timeout {
904 tonic_request.set_timeout(timeout);
905 }
906 let response = self.inner.get_session(tonic_request).await?;
907 Ok(from_wire_agent_session(response.into_inner()))
908 }
909
910 pub async fn get_session_raw(
912 &mut self,
913 request: GetAgentProviderSessionRequest,
914 ) -> Result<AgentSession, GestaltError> {
915 let mut request = request;
916 if request.context.is_none() {
917 request.context = self.context.clone();
918 }
919 let mut tonic_request =
920 tonic::Request::new(to_wire_get_agent_provider_session_request(request));
921 if let Some(timeout) = self.timeout {
922 tonic_request.set_timeout(timeout);
923 }
924 let response = self.inner.get_session(tonic_request).await?;
925 Ok(from_wire_agent_session(response.into_inner()))
926 }
927
928 pub async fn list_sessions(
930 &mut self,
931 options: AgentListSessionsOptions,
932 ) -> Result<Vec<AgentSession>, GestaltError> {
933 let request = ListAgentProviderSessionsRequest {
934 session_ids: options.session_ids,
935 state: options.state,
936 limit: options.limit,
937 summary_only: options.summary_only,
938 provider_name: options.provider_name,
939 context: self.context.clone(),
940 ..Default::default()
941 };
942 let mut tonic_request =
943 tonic::Request::new(to_wire_list_agent_provider_sessions_request(request));
944 if let Some(timeout) = self.timeout {
945 tonic_request.set_timeout(timeout);
946 }
947 let response = from_wire_list_agent_provider_sessions_response(
948 self.inner.list_sessions(tonic_request).await?.into_inner(),
949 );
950 Ok(response.sessions)
951 }
952
953 pub async fn list_sessions_raw(
955 &mut self,
956 request: ListAgentProviderSessionsRequest,
957 ) -> Result<ListAgentProviderSessionsResponse, GestaltError> {
958 let mut request = request;
959 if request.context.is_none() {
960 request.context = self.context.clone();
961 }
962 let mut tonic_request =
963 tonic::Request::new(to_wire_list_agent_provider_sessions_request(request));
964 if let Some(timeout) = self.timeout {
965 tonic_request.set_timeout(timeout);
966 }
967 let response = self.inner.list_sessions(tonic_request).await?;
968 Ok(from_wire_list_agent_provider_sessions_response(
969 response.into_inner(),
970 ))
971 }
972
973 pub async fn update_session(
975 &mut self,
976 session_id: String,
977 options: AgentUpdateSessionOptions,
978 ) -> Result<AgentSession, GestaltError> {
979 let request = UpdateAgentProviderSessionRequest {
980 session_id,
981 client_ref: options.client_ref,
982 state: options.state,
983 provider_name: options.provider_name,
984 metadata: options.metadata,
985 context: self.context.clone(),
986 ..Default::default()
987 };
988 let mut tonic_request =
989 tonic::Request::new(to_wire_update_agent_provider_session_request(request));
990 if let Some(timeout) = self.timeout {
991 tonic_request.set_timeout(timeout);
992 }
993 let response = self.inner.update_session(tonic_request).await?;
994 Ok(from_wire_agent_session(response.into_inner()))
995 }
996
997 pub async fn update_session_raw(
999 &mut self,
1000 request: UpdateAgentProviderSessionRequest,
1001 ) -> Result<AgentSession, GestaltError> {
1002 let mut request = request;
1003 if request.context.is_none() {
1004 request.context = self.context.clone();
1005 }
1006 let mut tonic_request =
1007 tonic::Request::new(to_wire_update_agent_provider_session_request(request));
1008 if let Some(timeout) = self.timeout {
1009 tonic_request.set_timeout(timeout);
1010 }
1011 let response = self.inner.update_session(tonic_request).await?;
1012 Ok(from_wire_agent_session(response.into_inner()))
1013 }
1014
1015 pub async fn create_turn(
1017 &mut self,
1018 session_id: String,
1019 idempotency_key: String,
1020 model: String,
1021 messages: Vec<AgentMessage>,
1022 options: AgentCreateTurnOptions,
1023 ) -> Result<AgentTurn, GestaltError> {
1024 let request = CreateAgentProviderTurnRequest {
1025 session_id,
1026 idempotency_key,
1027 model,
1028 messages,
1029 execution_ref: options.execution_ref,
1030 timeout_seconds: options.timeout_seconds,
1031 provider_name: options.provider_name,
1032 metadata: options.metadata,
1033 model_options: options.model_options,
1034 output: options.output,
1035 context: self.context.clone(),
1036 ..Default::default()
1037 };
1038 let mut tonic_request =
1039 tonic::Request::new(to_wire_create_agent_provider_turn_request(request));
1040 if let Some(timeout) = self.timeout {
1041 tonic_request.set_timeout(timeout);
1042 }
1043 let response = self.inner.create_turn(tonic_request).await?;
1044 Ok(from_wire_agent_turn(response.into_inner()))
1045 }
1046
1047 pub async fn create_turn_raw(
1049 &mut self,
1050 request: CreateAgentProviderTurnRequest,
1051 ) -> Result<AgentTurn, GestaltError> {
1052 let mut request = request;
1053 if request.context.is_none() {
1054 request.context = self.context.clone();
1055 }
1056 let mut tonic_request =
1057 tonic::Request::new(to_wire_create_agent_provider_turn_request(request));
1058 if let Some(timeout) = self.timeout {
1059 tonic_request.set_timeout(timeout);
1060 }
1061 let response = self.inner.create_turn(tonic_request).await?;
1062 Ok(from_wire_agent_turn(response.into_inner()))
1063 }
1064
1065 pub async fn get_turn(
1067 &mut self,
1068 turn_id: String,
1069 options: AgentGetTurnOptions,
1070 ) -> Result<AgentTurn, GestaltError> {
1071 let request = GetAgentProviderTurnRequest {
1072 turn_id,
1073 provider_name: options.provider_name,
1074 context: self.context.clone(),
1075 ..Default::default()
1076 };
1077 let mut tonic_request =
1078 tonic::Request::new(to_wire_get_agent_provider_turn_request(request));
1079 if let Some(timeout) = self.timeout {
1080 tonic_request.set_timeout(timeout);
1081 }
1082 let response = self.inner.get_turn(tonic_request).await?;
1083 Ok(from_wire_agent_turn(response.into_inner()))
1084 }
1085
1086 pub async fn get_turn_raw(
1088 &mut self,
1089 request: GetAgentProviderTurnRequest,
1090 ) -> Result<AgentTurn, GestaltError> {
1091 let mut request = request;
1092 if request.context.is_none() {
1093 request.context = self.context.clone();
1094 }
1095 let mut tonic_request =
1096 tonic::Request::new(to_wire_get_agent_provider_turn_request(request));
1097 if let Some(timeout) = self.timeout {
1098 tonic_request.set_timeout(timeout);
1099 }
1100 let response = self.inner.get_turn(tonic_request).await?;
1101 Ok(from_wire_agent_turn(response.into_inner()))
1102 }
1103
1104 pub async fn list_turns(
1106 &mut self,
1107 session_id: String,
1108 options: AgentListTurnsOptions,
1109 ) -> Result<Vec<AgentTurn>, GestaltError> {
1110 let request = ListAgentProviderTurnsRequest {
1111 session_id,
1112 turn_ids: options.turn_ids,
1113 status: options.status,
1114 limit: options.limit,
1115 summary_only: options.summary_only,
1116 provider_name: options.provider_name,
1117 context: self.context.clone(),
1118 ..Default::default()
1119 };
1120 let mut tonic_request =
1121 tonic::Request::new(to_wire_list_agent_provider_turns_request(request));
1122 if let Some(timeout) = self.timeout {
1123 tonic_request.set_timeout(timeout);
1124 }
1125 let response = from_wire_list_agent_provider_turns_response(
1126 self.inner.list_turns(tonic_request).await?.into_inner(),
1127 );
1128 Ok(response.turns)
1129 }
1130
1131 pub async fn list_turns_raw(
1133 &mut self,
1134 request: ListAgentProviderTurnsRequest,
1135 ) -> Result<ListAgentProviderTurnsResponse, GestaltError> {
1136 let mut request = request;
1137 if request.context.is_none() {
1138 request.context = self.context.clone();
1139 }
1140 let mut tonic_request =
1141 tonic::Request::new(to_wire_list_agent_provider_turns_request(request));
1142 if let Some(timeout) = self.timeout {
1143 tonic_request.set_timeout(timeout);
1144 }
1145 let response = self.inner.list_turns(tonic_request).await?;
1146 Ok(from_wire_list_agent_provider_turns_response(
1147 response.into_inner(),
1148 ))
1149 }
1150
1151 pub async fn cancel_turn(
1153 &mut self,
1154 turn_id: String,
1155 options: AgentCancelTurnOptions,
1156 ) -> Result<AgentTurn, GestaltError> {
1157 let request = CancelAgentProviderTurnRequest {
1158 turn_id,
1159 reason: options.reason,
1160 provider_name: options.provider_name,
1161 context: self.context.clone(),
1162 ..Default::default()
1163 };
1164 let mut tonic_request =
1165 tonic::Request::new(to_wire_cancel_agent_provider_turn_request(request));
1166 if let Some(timeout) = self.timeout {
1167 tonic_request.set_timeout(timeout);
1168 }
1169 let response = self.inner.cancel_turn(tonic_request).await?;
1170 Ok(from_wire_agent_turn(response.into_inner()))
1171 }
1172
1173 pub async fn cancel_turn_raw(
1175 &mut self,
1176 request: CancelAgentProviderTurnRequest,
1177 ) -> Result<AgentTurn, GestaltError> {
1178 let mut request = request;
1179 if request.context.is_none() {
1180 request.context = self.context.clone();
1181 }
1182 let mut tonic_request =
1183 tonic::Request::new(to_wire_cancel_agent_provider_turn_request(request));
1184 if let Some(timeout) = self.timeout {
1185 tonic_request.set_timeout(timeout);
1186 }
1187 let response = self.inner.cancel_turn(tonic_request).await?;
1188 Ok(from_wire_agent_turn(response.into_inner()))
1189 }
1190
1191 pub async fn list_turn_events(
1193 &mut self,
1194 turn_id: String,
1195 options: AgentListTurnEventsOptions,
1196 ) -> Result<Vec<AgentTurnEvent>, GestaltError> {
1197 let request = ListAgentProviderTurnEventsRequest {
1198 turn_id,
1199 after_seq: options.after_seq,
1200 limit: options.limit,
1201 provider_name: options.provider_name,
1202 context: self.context.clone(),
1203 ..Default::default()
1204 };
1205 let mut tonic_request =
1206 tonic::Request::new(to_wire_list_agent_provider_turn_events_request(request));
1207 if let Some(timeout) = self.timeout {
1208 tonic_request.set_timeout(timeout);
1209 }
1210 let response = from_wire_list_agent_provider_turn_events_response(
1211 self.inner
1212 .list_turn_events(tonic_request)
1213 .await?
1214 .into_inner(),
1215 );
1216 Ok(response.events)
1217 }
1218
1219 pub async fn list_turn_events_raw(
1221 &mut self,
1222 request: ListAgentProviderTurnEventsRequest,
1223 ) -> Result<ListAgentProviderTurnEventsResponse, GestaltError> {
1224 let mut request = request;
1225 if request.context.is_none() {
1226 request.context = self.context.clone();
1227 }
1228 let mut tonic_request =
1229 tonic::Request::new(to_wire_list_agent_provider_turn_events_request(request));
1230 if let Some(timeout) = self.timeout {
1231 tonic_request.set_timeout(timeout);
1232 }
1233 let response = self.inner.list_turn_events(tonic_request).await?;
1234 Ok(from_wire_list_agent_provider_turn_events_response(
1235 response.into_inner(),
1236 ))
1237 }
1238
1239 pub async fn get_interaction(
1241 &mut self,
1242 interaction_id: String,
1243 ) -> Result<AgentInteraction, GestaltError> {
1244 let request = GetAgentProviderInteractionRequest {
1245 interaction_id,
1246 context: self.context.clone(),
1247 ..Default::default()
1248 };
1249 let mut tonic_request =
1250 tonic::Request::new(to_wire_get_agent_provider_interaction_request(request));
1251 if let Some(timeout) = self.timeout {
1252 tonic_request.set_timeout(timeout);
1253 }
1254 let response = self.inner.get_interaction(tonic_request).await?;
1255 Ok(from_wire_agent_interaction(response.into_inner()))
1256 }
1257
1258 pub async fn get_interaction_raw(
1260 &mut self,
1261 request: GetAgentProviderInteractionRequest,
1262 ) -> Result<AgentInteraction, GestaltError> {
1263 let mut request = request;
1264 if request.context.is_none() {
1265 request.context = self.context.clone();
1266 }
1267 let mut tonic_request =
1268 tonic::Request::new(to_wire_get_agent_provider_interaction_request(request));
1269 if let Some(timeout) = self.timeout {
1270 tonic_request.set_timeout(timeout);
1271 }
1272 let response = self.inner.get_interaction(tonic_request).await?;
1273 Ok(from_wire_agent_interaction(response.into_inner()))
1274 }
1275
1276 pub async fn list_interactions(
1278 &mut self,
1279 turn_id: String,
1280 options: AgentListInteractionsOptions,
1281 ) -> Result<Vec<AgentInteraction>, GestaltError> {
1282 let request = ListAgentProviderInteractionsRequest {
1283 turn_id,
1284 provider_name: options.provider_name,
1285 context: self.context.clone(),
1286 ..Default::default()
1287 };
1288 let mut tonic_request =
1289 tonic::Request::new(to_wire_list_agent_provider_interactions_request(request));
1290 if let Some(timeout) = self.timeout {
1291 tonic_request.set_timeout(timeout);
1292 }
1293 let response = from_wire_list_agent_provider_interactions_response(
1294 self.inner
1295 .list_interactions(tonic_request)
1296 .await?
1297 .into_inner(),
1298 );
1299 Ok(response.interactions)
1300 }
1301
1302 pub async fn list_interactions_raw(
1304 &mut self,
1305 request: ListAgentProviderInteractionsRequest,
1306 ) -> Result<ListAgentProviderInteractionsResponse, GestaltError> {
1307 let mut request = request;
1308 if request.context.is_none() {
1309 request.context = self.context.clone();
1310 }
1311 let mut tonic_request =
1312 tonic::Request::new(to_wire_list_agent_provider_interactions_request(request));
1313 if let Some(timeout) = self.timeout {
1314 tonic_request.set_timeout(timeout);
1315 }
1316 let response = self.inner.list_interactions(tonic_request).await?;
1317 Ok(from_wire_list_agent_provider_interactions_response(
1318 response.into_inner(),
1319 ))
1320 }
1321
1322 pub async fn resolve_interaction(
1324 &mut self,
1325 interaction_id: String,
1326 resolution: Option<serde_json::Map<String, serde_json::Value>>,
1327 options: AgentResolveInteractionOptions,
1328 ) -> Result<AgentInteraction, GestaltError> {
1329 let request = ResolveAgentProviderInteractionRequest {
1330 interaction_id,
1331 resolution,
1332 turn_id: options.turn_id,
1333 provider_name: options.provider_name,
1334 context: self.context.clone(),
1335 ..Default::default()
1336 };
1337 let mut tonic_request =
1338 tonic::Request::new(to_wire_resolve_agent_provider_interaction_request(request));
1339 if let Some(timeout) = self.timeout {
1340 tonic_request.set_timeout(timeout);
1341 }
1342 let response = self.inner.resolve_interaction(tonic_request).await?;
1343 Ok(from_wire_agent_interaction(response.into_inner()))
1344 }
1345
1346 pub async fn resolve_interaction_raw(
1348 &mut self,
1349 request: ResolveAgentProviderInteractionRequest,
1350 ) -> Result<AgentInteraction, GestaltError> {
1351 let mut request = request;
1352 if request.context.is_none() {
1353 request.context = self.context.clone();
1354 }
1355 let mut tonic_request =
1356 tonic::Request::new(to_wire_resolve_agent_provider_interaction_request(request));
1357 if let Some(timeout) = self.timeout {
1358 tonic_request.set_timeout(timeout);
1359 }
1360 let response = self.inner.resolve_interaction(tonic_request).await?;
1361 Ok(from_wire_agent_interaction(response.into_inner()))
1362 }
1363
1364 pub async fn get_capabilities(
1366 &mut self,
1367 request: GetAgentProviderCapabilitiesRequest,
1368 ) -> Result<AgentProviderCapabilities, GestaltError> {
1369 let mut tonic_request =
1370 tonic::Request::new(to_wire_get_agent_provider_capabilities_request(request));
1371 if let Some(timeout) = self.timeout {
1372 tonic_request.set_timeout(timeout);
1373 }
1374 let response = self.inner.get_capabilities(tonic_request).await?;
1375 Ok(from_wire_agent_provider_capabilities(response.into_inner()))
1376 }
1377}
1378
1379#[derive(Clone, Debug, Default)]
1382pub struct AgentCreateSessionOptions {
1383 pub provider_name: String,
1385 pub client_ref: String,
1387 pub metadata: Option<serde_json::Map<String, serde_json::Value>>,
1389 pub workspace: Option<AgentWorkspace>,
1391 pub tools: Option<AgentToolConfig>,
1393}
1394
1395#[derive(Clone, Debug, Default)]
1398pub struct AgentGetSessionOptions {
1399 pub provider_name: String,
1401}
1402
1403#[derive(Clone, Debug, Default)]
1406pub struct AgentListSessionsOptions {
1407 pub session_ids: Vec<String>,
1409 pub state: AgentSessionState,
1411 pub limit: i32,
1416 pub summary_only: bool,
1421 pub provider_name: String,
1423}
1424
1425#[derive(Clone, Debug, Default)]
1428pub struct AgentUpdateSessionOptions {
1429 pub client_ref: String,
1431 pub state: AgentSessionState,
1433 pub provider_name: String,
1435 pub metadata: Option<serde_json::Map<String, serde_json::Value>>,
1437}
1438
1439#[derive(Clone, Debug, Default)]
1442pub struct AgentCreateTurnOptions {
1443 pub execution_ref: String,
1445 pub timeout_seconds: i32,
1451 pub provider_name: String,
1453 pub metadata: Option<serde_json::Map<String, serde_json::Value>>,
1455 pub model_options: Option<serde_json::Map<String, serde_json::Value>>,
1457 pub output: Option<AgentOutput>,
1459}
1460
1461#[derive(Clone, Debug, Default)]
1464pub struct AgentGetTurnOptions {
1465 pub provider_name: String,
1467}
1468
1469#[derive(Clone, Debug, Default)]
1472pub struct AgentListTurnsOptions {
1473 pub turn_ids: Vec<String>,
1475 pub status: AgentExecutionStatus,
1477 pub limit: i32,
1482 pub summary_only: bool,
1488 pub provider_name: String,
1490}
1491
1492#[derive(Clone, Debug, Default)]
1495pub struct AgentCancelTurnOptions {
1496 pub reason: String,
1498 pub provider_name: String,
1500}
1501
1502#[derive(Clone, Debug, Default)]
1505pub struct AgentListTurnEventsOptions {
1506 pub after_seq: i64,
1508 pub limit: i32,
1510 pub provider_name: String,
1512}
1513
1514#[derive(Clone, Debug, Default)]
1517pub struct AgentListInteractionsOptions {
1518 pub provider_name: String,
1520}
1521
1522#[derive(Clone, Debug, Default)]
1525pub struct AgentResolveInteractionOptions {
1526 pub turn_id: String,
1528 pub provider_name: String,
1530}