use crate::app::{AgentToolRef, OperationAnnotations, RequestContext, SubjectContext};
use crate::codec::agent::{
from_wire_agent_interaction, from_wire_agent_provider_capabilities, from_wire_agent_session,
from_wire_agent_turn, from_wire_list_agent_provider_interactions_response,
from_wire_list_agent_provider_sessions_response,
from_wire_list_agent_provider_turn_events_response,
from_wire_list_agent_provider_turns_response, to_wire_cancel_agent_provider_turn_request,
to_wire_create_agent_provider_session_request, to_wire_create_agent_provider_turn_request,
to_wire_get_agent_provider_capabilities_request,
to_wire_get_agent_provider_interaction_request, to_wire_get_agent_provider_session_request,
to_wire_get_agent_provider_turn_request, to_wire_list_agent_provider_interactions_request,
to_wire_list_agent_provider_sessions_request, to_wire_list_agent_provider_turn_events_request,
to_wire_list_agent_provider_turns_request, to_wire_resolve_agent_provider_interaction_request,
to_wire_update_agent_provider_session_request,
};
use crate::codec::host_service::{HostServiceChannel, connect_host_service, plain_channel};
use crate::generated::v1;
use crate::rpc_support::GestaltError;
pub type AgentExecutionStatus = i32;
pub mod agent_execution_status {
pub const AGENT_EXECUTION_STATUS_UNSPECIFIED: i32 = 0;
pub const AGENT_EXECUTION_STATUS_PENDING: i32 = 1;
pub const AGENT_EXECUTION_STATUS_RUNNING: i32 = 2;
pub const AGENT_EXECUTION_STATUS_SUCCEEDED: i32 = 3;
pub const AGENT_EXECUTION_STATUS_FAILED: i32 = 4;
pub const AGENT_EXECUTION_STATUS_CANCELED: i32 = 5;
pub const AGENT_EXECUTION_STATUS_WAITING_FOR_INPUT: i32 = 6;
}
pub type AgentInteractionState = i32;
pub mod agent_interaction_state {
pub const AGENT_INTERACTION_STATE_UNSPECIFIED: i32 = 0;
pub const AGENT_INTERACTION_STATE_PENDING: i32 = 1;
pub const AGENT_INTERACTION_STATE_RESOLVED: i32 = 2;
pub const AGENT_INTERACTION_STATE_CANCELED: i32 = 3;
}
pub type AgentInteractionType = i32;
pub mod agent_interaction_type {
pub const AGENT_INTERACTION_TYPE_UNSPECIFIED: i32 = 0;
pub const AGENT_INTERACTION_TYPE_APPROVAL: i32 = 1;
pub const AGENT_INTERACTION_TYPE_CLARIFICATION: i32 = 2;
pub const AGENT_INTERACTION_TYPE_INPUT: i32 = 3;
}
pub type AgentMessagePartType = i32;
pub mod agent_message_part_type {
pub const AGENT_MESSAGE_PART_TYPE_UNSPECIFIED: i32 = 0;
pub const AGENT_MESSAGE_PART_TYPE_TEXT: i32 = 1;
pub const AGENT_MESSAGE_PART_TYPE_JSON: i32 = 2;
pub const AGENT_MESSAGE_PART_TYPE_TOOL_CALL: i32 = 3;
pub const AGENT_MESSAGE_PART_TYPE_TOOL_RESULT: i32 = 4;
pub const AGENT_MESSAGE_PART_TYPE_IMAGE_REF: i32 = 5;
}
pub type AgentSessionState = i32;
pub mod agent_session_state {
pub const AGENT_SESSION_STATE_UNSPECIFIED: i32 = 0;
pub const AGENT_SESSION_STATE_ACTIVE: i32 = 1;
pub const AGENT_SESSION_STATE_ARCHIVED: i32 = 2;
}
pub type AgentToolSourceMode = i32;
pub mod agent_tool_source_mode {
pub const AGENT_TOOL_SOURCE_MODE_UNSPECIFIED: i32 = 0;
pub const AGENT_TOOL_SOURCE_MODE_CATALOG: i32 = 2;
pub const AGENT_TOOL_SOURCE_MODE_NONE: i32 = 3;
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct AgentCatalogToolConfig {
pub refs: Vec<AgentToolRef>,
pub tools: Vec<ListedAgentTool>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct AgentInteraction {
pub id: String,
pub r#type: AgentInteractionType,
pub state: AgentInteractionState,
pub title: String,
pub prompt: String,
pub request: Option<serde_json::Map<String, serde_json::Value>>,
pub resolution: Option<serde_json::Map<String, serde_json::Value>>,
pub created_at: Option<std::time::SystemTime>,
pub resolved_at: Option<std::time::SystemTime>,
pub turn_id: String,
pub session_id: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct AgentMessage {
pub role: String,
pub text: String,
pub parts: Vec<AgentMessagePart>,
pub metadata: Option<serde_json::Map<String, serde_json::Value>>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct AgentMessagePart {
pub r#type: AgentMessagePartType,
pub text: String,
pub json: Option<serde_json::Map<String, serde_json::Value>>,
pub tool_call: Option<AgentMessagePartToolCall>,
pub tool_result: Option<AgentMessagePartToolResult>,
pub image_ref: Option<AgentMessagePartImageRef>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct AgentMessagePartImageRef {
pub uri: String,
pub mime_type: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct AgentMessagePartToolCall {
pub id: String,
pub tool_id: String,
pub arguments: Option<serde_json::Map<String, serde_json::Value>>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct AgentMessagePartToolResult {
pub tool_call_id: String,
pub status: i32,
pub content: String,
pub output: Option<serde_json::Map<String, serde_json::Value>>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct AgentNoTools {}
#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
#[derive(Clone, Debug, PartialEq)]
pub enum AgentOutputKind {
Text(AgentTextOutput),
Structured(AgentStructuredOutput),
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct AgentOutput {
pub kind: Option<AgentOutputKind>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct AgentProviderCapabilities {
pub streaming_text: bool,
pub tool_calls: bool,
pub parallel_tool_calls: bool,
pub interactions: bool,
pub resumable_turns: bool,
pub reasoning_summaries: bool,
pub bounded_list_hydration: bool,
pub supported_tool_sources: Vec<AgentToolSourceMode>,
pub supports_session_start: bool,
pub supports_prepared_workspace: bool,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct AgentSession {
pub id: String,
pub provider_name: String,
pub model: String,
pub client_ref: String,
pub state: AgentSessionState,
pub metadata: Option<serde_json::Map<String, serde_json::Value>>,
pub created_by_subject_id: String,
pub created_at: Option<std::time::SystemTime>,
pub updated_at: Option<std::time::SystemTime>,
pub last_turn_at: Option<std::time::SystemTime>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct AgentSessionStartConfig {
pub hooks: Vec<AgentSessionStartHook>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct AgentSessionStartHook {
pub id: String,
pub r#type: String,
pub command: Vec<String>,
pub cwd: String,
pub timeout: String,
pub env: std::collections::BTreeMap<String, String>,
pub output: Option<AgentSessionStartHookOutput>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct AgentSessionStartHookOutput {
pub additional_context: bool,
pub metadata: bool,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct AgentStructuredOutput {
pub schema: Option<serde_json::Map<String, serde_json::Value>>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct AgentTextOutput {}
#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
#[derive(Clone, Debug, PartialEq)]
pub enum AgentToolConfigSource {
None(AgentNoTools),
Catalog(AgentCatalogToolConfig),
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct AgentToolConfig {
pub source: Option<AgentToolConfigSource>,
}
#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
#[derive(Clone, Debug, PartialEq)]
pub enum AgentTurnOutput {
Text(AgentTurnTextOutput),
Structured(AgentTurnStructuredOutput),
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct AgentTurn {
pub id: String,
pub session_id: String,
pub provider_name: String,
pub model: String,
pub status: AgentExecutionStatus,
pub messages: Vec<AgentMessage>,
pub status_message: String,
pub created_by_subject_id: String,
pub created_at: Option<std::time::SystemTime>,
pub started_at: Option<std::time::SystemTime>,
pub completed_at: Option<std::time::SystemTime>,
pub execution_ref: String,
pub output: Option<AgentTurnOutput>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct AgentTurnDisplay {
pub kind: String,
pub phase: String,
pub text: String,
pub label: String,
pub r#ref: String,
pub parent_ref: String,
pub input: Option<serde_json::Value>,
pub output: Option<serde_json::Value>,
pub error: Option<serde_json::Value>,
pub action: String,
pub format: String,
pub language: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct AgentTurnEvent {
pub id: String,
pub turn_id: String,
pub seq: i64,
pub r#type: String,
pub source: String,
pub visibility: String,
pub data: Option<serde_json::Map<String, serde_json::Value>>,
pub created_at: Option<std::time::SystemTime>,
pub display: Option<AgentTurnDisplay>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct AgentTurnStructuredOutput {
pub text: String,
pub value: Option<serde_json::Map<String, serde_json::Value>>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct AgentTurnTextOutput {
pub text: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct AgentWorkspace {
pub checkouts: Vec<AgentWorkspaceGitCheckout>,
pub cwd: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct AgentWorkspaceGitCheckout {
pub url: String,
pub r#ref: String,
pub path: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct CancelAgentProviderTurnRequest {
pub turn_id: String,
pub reason: String,
pub subject: Option<SubjectContext>,
pub context: Option<RequestContext>,
pub provider_name: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct CreateAgentProviderSessionRequest {
pub idempotency_key: String,
pub model: String,
pub client_ref: String,
pub metadata: Option<serde_json::Map<String, serde_json::Value>>,
pub created_by_subject_id: String,
pub subject: Option<SubjectContext>,
pub session_start: Option<AgentSessionStartConfig>,
pub prepared_workspace: Option<PreparedAgentWorkspace>,
pub provider_name: String,
pub workspace: Option<AgentWorkspace>,
pub context: Option<RequestContext>,
pub tools: Option<AgentToolConfig>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct CreateAgentProviderTurnRequest {
pub turn_id: String,
pub session_id: String,
pub idempotency_key: String,
pub model: String,
pub messages: Vec<AgentMessage>,
pub metadata: Option<serde_json::Map<String, serde_json::Value>>,
pub created_by_subject_id: String,
pub execution_ref: String,
pub subject: Option<SubjectContext>,
pub model_options: Option<serde_json::Map<String, serde_json::Value>>,
pub timeout_seconds: i32,
pub output: Option<AgentOutput>,
pub context: Option<RequestContext>,
pub provider_name: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct GetAgentProviderCapabilitiesRequest {}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct GetAgentProviderInteractionRequest {
pub interaction_id: String,
pub subject: Option<SubjectContext>,
pub context: Option<RequestContext>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct GetAgentProviderSessionRequest {
pub session_id: String,
pub subject: Option<SubjectContext>,
pub context: Option<RequestContext>,
pub provider_name: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct GetAgentProviderTurnRequest {
pub turn_id: String,
pub subject: Option<SubjectContext>,
pub context: Option<RequestContext>,
pub provider_name: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct ListAgentProviderInteractionsRequest {
pub turn_id: String,
pub subject: Option<SubjectContext>,
pub context: Option<RequestContext>,
pub provider_name: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct ListAgentProviderInteractionsResponse {
pub interactions: Vec<AgentInteraction>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct ListAgentProviderSessionsRequest {
pub subject: Option<SubjectContext>,
pub session_ids: Vec<String>,
pub state: AgentSessionState,
pub limit: i32,
pub summary_only: bool,
pub provider_name: String,
pub context: Option<RequestContext>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct ListAgentProviderSessionsResponse {
pub sessions: Vec<AgentSession>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct ListAgentProviderTurnEventsRequest {
pub turn_id: String,
pub after_seq: i64,
pub limit: i32,
pub subject: Option<SubjectContext>,
pub context: Option<RequestContext>,
pub provider_name: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct ListAgentProviderTurnEventsResponse {
pub events: Vec<AgentTurnEvent>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct ListAgentProviderTurnsRequest {
pub session_id: String,
pub subject: Option<SubjectContext>,
pub turn_ids: Vec<String>,
pub status: AgentExecutionStatus,
pub limit: i32,
pub summary_only: bool,
pub context: Option<RequestContext>,
pub provider_name: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct ListAgentProviderTurnsResponse {
pub turns: Vec<AgentTurn>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct ListedAgentTool {
pub id: String,
pub mcp_name: String,
pub title: String,
pub description: String,
pub input_schema: String,
pub output_schema: String,
pub annotations: Option<OperationAnnotations>,
pub r#ref: Option<AgentToolRef>,
pub tags: Vec<String>,
pub search_text: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct PreparedAgentWorkspace {
pub root: String,
pub cwd: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct ResolveAgentProviderInteractionRequest {
pub interaction_id: String,
pub resolution: Option<serde_json::Map<String, serde_json::Value>>,
pub subject: Option<SubjectContext>,
pub turn_id: String,
pub context: Option<RequestContext>,
pub provider_name: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct UpdateAgentProviderSessionRequest {
pub session_id: String,
pub client_ref: String,
pub state: AgentSessionState,
pub metadata: Option<serde_json::Map<String, serde_json::Value>>,
pub subject: Option<SubjectContext>,
pub context: Option<RequestContext>,
pub provider_name: String,
}
pub struct Agent {
inner: v1::agent_client::AgentClient<HostServiceChannel>,
timeout: Option<std::time::Duration>,
context: Option<RequestContext>,
}
impl Agent {
pub fn new(channel: tonic::transport::Channel) -> Self {
Self {
inner: v1::agent_client::AgentClient::new(plain_channel(channel)),
timeout: None,
context: None,
}
}
pub fn with_timeout(mut self, timeout: std::time::Duration) -> Self {
self.timeout = Some(timeout);
self
}
pub fn with_context(mut self, context: RequestContext) -> Self {
self.context = Some(context);
self
}
pub async fn connect() -> Result<Self, GestaltError> {
Self::connect_named("").await
}
pub async fn connect_named(name: &str) -> Result<Self, GestaltError> {
Ok(Self {
inner: v1::agent_client::AgentClient::new(connect_host_service("agent", name).await?),
timeout: None,
context: None,
})
}
pub async fn create_session(
&mut self,
idempotency_key: String,
model: String,
options: AgentCreateSessionOptions,
) -> Result<AgentSession, GestaltError> {
let request = CreateAgentProviderSessionRequest {
idempotency_key,
model,
provider_name: options.provider_name,
client_ref: options.client_ref,
metadata: options.metadata,
workspace: options.workspace,
tools: options.tools,
context: self.context.clone(),
..Default::default()
};
let mut tonic_request =
tonic::Request::new(to_wire_create_agent_provider_session_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.create_session(tonic_request).await?;
Ok(from_wire_agent_session(response.into_inner()))
}
pub async fn create_session_raw(
&mut self,
request: CreateAgentProviderSessionRequest,
) -> Result<AgentSession, GestaltError> {
let mut request = request;
if request.context.is_none() {
request.context = self.context.clone();
}
let mut tonic_request =
tonic::Request::new(to_wire_create_agent_provider_session_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.create_session(tonic_request).await?;
Ok(from_wire_agent_session(response.into_inner()))
}
pub async fn get_session(
&mut self,
session_id: String,
options: AgentGetSessionOptions,
) -> Result<AgentSession, GestaltError> {
let request = GetAgentProviderSessionRequest {
session_id,
provider_name: options.provider_name,
context: self.context.clone(),
..Default::default()
};
let mut tonic_request =
tonic::Request::new(to_wire_get_agent_provider_session_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.get_session(tonic_request).await?;
Ok(from_wire_agent_session(response.into_inner()))
}
pub async fn get_session_raw(
&mut self,
request: GetAgentProviderSessionRequest,
) -> Result<AgentSession, GestaltError> {
let mut request = request;
if request.context.is_none() {
request.context = self.context.clone();
}
let mut tonic_request =
tonic::Request::new(to_wire_get_agent_provider_session_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.get_session(tonic_request).await?;
Ok(from_wire_agent_session(response.into_inner()))
}
pub async fn list_sessions(
&mut self,
options: AgentListSessionsOptions,
) -> Result<Vec<AgentSession>, GestaltError> {
let request = ListAgentProviderSessionsRequest {
session_ids: options.session_ids,
state: options.state,
limit: options.limit,
summary_only: options.summary_only,
provider_name: options.provider_name,
context: self.context.clone(),
..Default::default()
};
let mut tonic_request =
tonic::Request::new(to_wire_list_agent_provider_sessions_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = from_wire_list_agent_provider_sessions_response(
self.inner.list_sessions(tonic_request).await?.into_inner(),
);
Ok(response.sessions)
}
pub async fn list_sessions_raw(
&mut self,
request: ListAgentProviderSessionsRequest,
) -> Result<ListAgentProviderSessionsResponse, GestaltError> {
let mut request = request;
if request.context.is_none() {
request.context = self.context.clone();
}
let mut tonic_request =
tonic::Request::new(to_wire_list_agent_provider_sessions_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.list_sessions(tonic_request).await?;
Ok(from_wire_list_agent_provider_sessions_response(
response.into_inner(),
))
}
pub async fn update_session(
&mut self,
session_id: String,
options: AgentUpdateSessionOptions,
) -> Result<AgentSession, GestaltError> {
let request = UpdateAgentProviderSessionRequest {
session_id,
client_ref: options.client_ref,
state: options.state,
provider_name: options.provider_name,
metadata: options.metadata,
context: self.context.clone(),
..Default::default()
};
let mut tonic_request =
tonic::Request::new(to_wire_update_agent_provider_session_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.update_session(tonic_request).await?;
Ok(from_wire_agent_session(response.into_inner()))
}
pub async fn update_session_raw(
&mut self,
request: UpdateAgentProviderSessionRequest,
) -> Result<AgentSession, GestaltError> {
let mut request = request;
if request.context.is_none() {
request.context = self.context.clone();
}
let mut tonic_request =
tonic::Request::new(to_wire_update_agent_provider_session_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.update_session(tonic_request).await?;
Ok(from_wire_agent_session(response.into_inner()))
}
pub async fn create_turn(
&mut self,
session_id: String,
idempotency_key: String,
model: String,
messages: Vec<AgentMessage>,
options: AgentCreateTurnOptions,
) -> Result<AgentTurn, GestaltError> {
let request = CreateAgentProviderTurnRequest {
session_id,
idempotency_key,
model,
messages,
execution_ref: options.execution_ref,
timeout_seconds: options.timeout_seconds,
provider_name: options.provider_name,
metadata: options.metadata,
model_options: options.model_options,
output: options.output,
context: self.context.clone(),
..Default::default()
};
let mut tonic_request =
tonic::Request::new(to_wire_create_agent_provider_turn_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.create_turn(tonic_request).await?;
Ok(from_wire_agent_turn(response.into_inner()))
}
pub async fn create_turn_raw(
&mut self,
request: CreateAgentProviderTurnRequest,
) -> Result<AgentTurn, GestaltError> {
let mut request = request;
if request.context.is_none() {
request.context = self.context.clone();
}
let mut tonic_request =
tonic::Request::new(to_wire_create_agent_provider_turn_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.create_turn(tonic_request).await?;
Ok(from_wire_agent_turn(response.into_inner()))
}
pub async fn get_turn(
&mut self,
turn_id: String,
options: AgentGetTurnOptions,
) -> Result<AgentTurn, GestaltError> {
let request = GetAgentProviderTurnRequest {
turn_id,
provider_name: options.provider_name,
context: self.context.clone(),
..Default::default()
};
let mut tonic_request =
tonic::Request::new(to_wire_get_agent_provider_turn_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.get_turn(tonic_request).await?;
Ok(from_wire_agent_turn(response.into_inner()))
}
pub async fn get_turn_raw(
&mut self,
request: GetAgentProviderTurnRequest,
) -> Result<AgentTurn, GestaltError> {
let mut request = request;
if request.context.is_none() {
request.context = self.context.clone();
}
let mut tonic_request =
tonic::Request::new(to_wire_get_agent_provider_turn_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.get_turn(tonic_request).await?;
Ok(from_wire_agent_turn(response.into_inner()))
}
pub async fn list_turns(
&mut self,
session_id: String,
options: AgentListTurnsOptions,
) -> Result<Vec<AgentTurn>, GestaltError> {
let request = ListAgentProviderTurnsRequest {
session_id,
turn_ids: options.turn_ids,
status: options.status,
limit: options.limit,
summary_only: options.summary_only,
provider_name: options.provider_name,
context: self.context.clone(),
..Default::default()
};
let mut tonic_request =
tonic::Request::new(to_wire_list_agent_provider_turns_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = from_wire_list_agent_provider_turns_response(
self.inner.list_turns(tonic_request).await?.into_inner(),
);
Ok(response.turns)
}
pub async fn list_turns_raw(
&mut self,
request: ListAgentProviderTurnsRequest,
) -> Result<ListAgentProviderTurnsResponse, GestaltError> {
let mut request = request;
if request.context.is_none() {
request.context = self.context.clone();
}
let mut tonic_request =
tonic::Request::new(to_wire_list_agent_provider_turns_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.list_turns(tonic_request).await?;
Ok(from_wire_list_agent_provider_turns_response(
response.into_inner(),
))
}
pub async fn cancel_turn(
&mut self,
turn_id: String,
options: AgentCancelTurnOptions,
) -> Result<AgentTurn, GestaltError> {
let request = CancelAgentProviderTurnRequest {
turn_id,
reason: options.reason,
provider_name: options.provider_name,
context: self.context.clone(),
..Default::default()
};
let mut tonic_request =
tonic::Request::new(to_wire_cancel_agent_provider_turn_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.cancel_turn(tonic_request).await?;
Ok(from_wire_agent_turn(response.into_inner()))
}
pub async fn cancel_turn_raw(
&mut self,
request: CancelAgentProviderTurnRequest,
) -> Result<AgentTurn, GestaltError> {
let mut request = request;
if request.context.is_none() {
request.context = self.context.clone();
}
let mut tonic_request =
tonic::Request::new(to_wire_cancel_agent_provider_turn_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.cancel_turn(tonic_request).await?;
Ok(from_wire_agent_turn(response.into_inner()))
}
pub async fn list_turn_events(
&mut self,
turn_id: String,
options: AgentListTurnEventsOptions,
) -> Result<Vec<AgentTurnEvent>, GestaltError> {
let request = ListAgentProviderTurnEventsRequest {
turn_id,
after_seq: options.after_seq,
limit: options.limit,
provider_name: options.provider_name,
context: self.context.clone(),
..Default::default()
};
let mut tonic_request =
tonic::Request::new(to_wire_list_agent_provider_turn_events_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = from_wire_list_agent_provider_turn_events_response(
self.inner
.list_turn_events(tonic_request)
.await?
.into_inner(),
);
Ok(response.events)
}
pub async fn list_turn_events_raw(
&mut self,
request: ListAgentProviderTurnEventsRequest,
) -> Result<ListAgentProviderTurnEventsResponse, GestaltError> {
let mut request = request;
if request.context.is_none() {
request.context = self.context.clone();
}
let mut tonic_request =
tonic::Request::new(to_wire_list_agent_provider_turn_events_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.list_turn_events(tonic_request).await?;
Ok(from_wire_list_agent_provider_turn_events_response(
response.into_inner(),
))
}
pub async fn get_interaction(
&mut self,
interaction_id: String,
) -> Result<AgentInteraction, GestaltError> {
let request = GetAgentProviderInteractionRequest {
interaction_id,
context: self.context.clone(),
..Default::default()
};
let mut tonic_request =
tonic::Request::new(to_wire_get_agent_provider_interaction_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.get_interaction(tonic_request).await?;
Ok(from_wire_agent_interaction(response.into_inner()))
}
pub async fn get_interaction_raw(
&mut self,
request: GetAgentProviderInteractionRequest,
) -> Result<AgentInteraction, GestaltError> {
let mut request = request;
if request.context.is_none() {
request.context = self.context.clone();
}
let mut tonic_request =
tonic::Request::new(to_wire_get_agent_provider_interaction_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.get_interaction(tonic_request).await?;
Ok(from_wire_agent_interaction(response.into_inner()))
}
pub async fn list_interactions(
&mut self,
turn_id: String,
options: AgentListInteractionsOptions,
) -> Result<Vec<AgentInteraction>, GestaltError> {
let request = ListAgentProviderInteractionsRequest {
turn_id,
provider_name: options.provider_name,
context: self.context.clone(),
..Default::default()
};
let mut tonic_request =
tonic::Request::new(to_wire_list_agent_provider_interactions_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = from_wire_list_agent_provider_interactions_response(
self.inner
.list_interactions(tonic_request)
.await?
.into_inner(),
);
Ok(response.interactions)
}
pub async fn list_interactions_raw(
&mut self,
request: ListAgentProviderInteractionsRequest,
) -> Result<ListAgentProviderInteractionsResponse, GestaltError> {
let mut request = request;
if request.context.is_none() {
request.context = self.context.clone();
}
let mut tonic_request =
tonic::Request::new(to_wire_list_agent_provider_interactions_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.list_interactions(tonic_request).await?;
Ok(from_wire_list_agent_provider_interactions_response(
response.into_inner(),
))
}
pub async fn resolve_interaction(
&mut self,
interaction_id: String,
resolution: Option<serde_json::Map<String, serde_json::Value>>,
options: AgentResolveInteractionOptions,
) -> Result<AgentInteraction, GestaltError> {
let request = ResolveAgentProviderInteractionRequest {
interaction_id,
resolution,
turn_id: options.turn_id,
provider_name: options.provider_name,
context: self.context.clone(),
..Default::default()
};
let mut tonic_request =
tonic::Request::new(to_wire_resolve_agent_provider_interaction_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.resolve_interaction(tonic_request).await?;
Ok(from_wire_agent_interaction(response.into_inner()))
}
pub async fn resolve_interaction_raw(
&mut self,
request: ResolveAgentProviderInteractionRequest,
) -> Result<AgentInteraction, GestaltError> {
let mut request = request;
if request.context.is_none() {
request.context = self.context.clone();
}
let mut tonic_request =
tonic::Request::new(to_wire_resolve_agent_provider_interaction_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.resolve_interaction(tonic_request).await?;
Ok(from_wire_agent_interaction(response.into_inner()))
}
pub async fn get_capabilities(
&mut self,
request: GetAgentProviderCapabilitiesRequest,
) -> Result<AgentProviderCapabilities, GestaltError> {
let mut tonic_request =
tonic::Request::new(to_wire_get_agent_provider_capabilities_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.get_capabilities(tonic_request).await?;
Ok(from_wire_agent_provider_capabilities(response.into_inner()))
}
}
#[derive(Clone, Debug, Default)]
pub struct AgentCreateSessionOptions {
pub provider_name: String,
pub client_ref: String,
pub metadata: Option<serde_json::Map<String, serde_json::Value>>,
pub workspace: Option<AgentWorkspace>,
pub tools: Option<AgentToolConfig>,
}
#[derive(Clone, Debug, Default)]
pub struct AgentGetSessionOptions {
pub provider_name: String,
}
#[derive(Clone, Debug, Default)]
pub struct AgentListSessionsOptions {
pub session_ids: Vec<String>,
pub state: AgentSessionState,
pub limit: i32,
pub summary_only: bool,
pub provider_name: String,
}
#[derive(Clone, Debug, Default)]
pub struct AgentUpdateSessionOptions {
pub client_ref: String,
pub state: AgentSessionState,
pub provider_name: String,
pub metadata: Option<serde_json::Map<String, serde_json::Value>>,
}
#[derive(Clone, Debug, Default)]
pub struct AgentCreateTurnOptions {
pub execution_ref: String,
pub timeout_seconds: i32,
pub provider_name: String,
pub metadata: Option<serde_json::Map<String, serde_json::Value>>,
pub model_options: Option<serde_json::Map<String, serde_json::Value>>,
pub output: Option<AgentOutput>,
}
#[derive(Clone, Debug, Default)]
pub struct AgentGetTurnOptions {
pub provider_name: String,
}
#[derive(Clone, Debug, Default)]
pub struct AgentListTurnsOptions {
pub turn_ids: Vec<String>,
pub status: AgentExecutionStatus,
pub limit: i32,
pub summary_only: bool,
pub provider_name: String,
}
#[derive(Clone, Debug, Default)]
pub struct AgentCancelTurnOptions {
pub reason: String,
pub provider_name: String,
}
#[derive(Clone, Debug, Default)]
pub struct AgentListTurnEventsOptions {
pub after_seq: i64,
pub limit: i32,
pub provider_name: String,
}
#[derive(Clone, Debug, Default)]
pub struct AgentListInteractionsOptions {
pub provider_name: String,
}
#[derive(Clone, Debug, Default)]
pub struct AgentResolveInteractionOptions {
pub turn_id: String,
pub provider_name: String,
}