diff --git a/agent-manager/proto/agent_manager_grpc.proto b/agent-manager/proto/agent_manager_grpc.proto index 90b2d21b..30f32e36 100644 --- a/agent-manager/proto/agent_manager_grpc.proto +++ b/agent-manager/proto/agent_manager_grpc.proto @@ -29,6 +29,8 @@ message RunAgentRequest { optional uint64 max_steps = 16; optional uint64 thinking_token_budget = 17; optional string start_url = 18; + optional bool disable_give_control = 19; + optional string user_agent = 20; } message ActionResult { diff --git a/agent-manager/src/agent_manager_grpc_pb2.py b/agent-manager/src/agent_manager_grpc_pb2.py index 0a991cfe..3c61da51 100644 --- a/agent-manager/src/agent_manager_grpc_pb2.py +++ b/agent-manager/src/agent_manager_grpc_pb2.py @@ -24,27 +24,27 @@ -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18\x61gent_manager_grpc.proto\x12\x12\x61gent_manager_grpc\"\xaf\x06\n\x0fRunAgentRequest\x12\x0e\n\x06prompt\x18\x01 \x01(\t\x12\x12\n\nsession_id\x18\x02 \x01(\t\x12\x17\n\x0fis_chat_request\x18\x03 \x01(\x08\x12\x1c\n\x0frequest_api_key\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x07\x63\x64p_url\x18\x05 \x01(\tH\x01\x88\x01\x01\x12 \n\x13parent_span_context\x18\x06 \x01(\tH\x02\x88\x01\x01\x12>\n\x0emodel_provider\x18\x07 \x01(\x0e\x32!.agent_manager_grpc.ModelProviderH\x03\x88\x01\x01\x12\x12\n\x05model\x18\x08 \x01(\tH\x04\x88\x01\x01\x12\x1c\n\x0f\x65nable_thinking\x18\t \x01(\x08H\x05\x88\x01\x01\x12\x1f\n\x12return_screenshots\x18\n \x01(\x08H\x06\x88\x01\x01\x12\x1f\n\x12return_agent_state\x18\x0b \x01(\x08H\x07\x88\x01\x01\x12!\n\x14return_storage_state\x18\x0c \x01(\x08H\x08\x88\x01\x01\x12\x1a\n\rstorage_state\x18\r \x01(\tH\t\x88\x01\x01\x12\x18\n\x0b\x61gent_state\x18\x0e \x01(\tH\n\x88\x01\x01\x12\x14\n\x07timeout\x18\x0f \x01(\x04H\x0b\x88\x01\x01\x12\x16\n\tmax_steps\x18\x10 \x01(\x04H\x0c\x88\x01\x01\x12\"\n\x15thinking_token_budget\x18\x11 \x01(\x04H\r\x88\x01\x01\x12\x16\n\tstart_url\x18\x12 \x01(\tH\x0e\x88\x01\x01\x42\x12\n\x10_request_api_keyB\n\n\x08_cdp_urlB\x16\n\x14_parent_span_contextB\x11\n\x0f_model_providerB\x08\n\x06_modelB\x12\n\x10_enable_thinkingB\x15\n\x13_return_screenshotsB\x15\n\x13_return_agent_stateB\x17\n\x15_return_storage_stateB\x10\n\x0e_storage_stateB\x0e\n\x0c_agent_stateB\n\n\x08_timeoutB\x0c\n\n_max_stepsB\x18\n\x16_thinking_token_budgetB\x0c\n\n_start_url\"\x9c\x01\n\x0c\x41\x63tionResult\x12\x14\n\x07is_done\x18\x01 \x01(\x08H\x00\x88\x01\x01\x12\x14\n\x07\x63ontent\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x12\n\x05\x65rror\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x19\n\x0cgive_control\x18\x04 \x01(\x08H\x03\x88\x01\x01\x42\n\n\x08_is_doneB\n\n\x08_contentB\x08\n\x06_errorB\x0f\n\r_give_control\"\x96\x01\n\x10StepChunkContent\x12\x37\n\raction_result\x18\x01 \x01(\x0b\x32 .agent_manager_grpc.ActionResult\x12\x0f\n\x07summary\x18\x02 \x01(\t\x12\x10\n\x08trace_id\x18\x03 \x01(\t\x12\x17\n\nscreenshot\x18\x04 \x01(\tH\x00\x88\x01\x01\x42\r\n\x0b_screenshot\"\xe3\x01\n\x0b\x41gentOutput\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .agent_manager_grpc.ActionResult\x12\x15\n\x08trace_id\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x17\n\nstep_count\x18\x03 \x01(\x04H\x01\x88\x01\x01\x12\x1a\n\rstorage_state\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x18\n\x0b\x61gent_state\x18\x05 \x01(\tH\x03\x88\x01\x01\x42\x0b\n\t_trace_idB\r\n\x0b_step_countB\x10\n\x0e_storage_stateB\x0e\n\x0c_agent_state\"$\n\x11\x45rrorChunkContent\x12\x0f\n\x07\x63ontent\x18\x01 \x01(\t\"\xb5\x02\n\x1bRunAgentResponseStreamChunk\x12\x42\n\x12step_chunk_content\x18\x01 \x01(\x0b\x32$.agent_manager_grpc.StepChunkContentH\x00\x12\x37\n\x0c\x61gent_output\x18\x02 \x01(\x0b\x32\x1f.agent_manager_grpc.AgentOutputH\x00\x12\x44\n\x13\x65rror_chunk_content\x18\x03 \x01(\x0b\x32%.agent_manager_grpc.ErrorChunkContentH\x00\x12\x45\n\x15timeout_chunk_content\x18\x04 \x01(\x0b\x32$.agent_manager_grpc.StepChunkContentH\x00\x42\x0c\n\nchunk_type*C\n\rModelProvider\x12\r\n\tANTHROPIC\x10\x00\x12\x0b\n\x07\x42\x45\x44ROCK\x10\x01\x12\n\n\x06OPENAI\x10\x02\x12\n\n\x06GEMINI\x10\x03\x32\xd1\x01\n\x13\x41gentManagerService\x12P\n\x08RunAgent\x12#.agent_manager_grpc.RunAgentRequest\x1a\x1f.agent_manager_grpc.AgentOutput\x12h\n\x0eRunAgentStream\x12#.agent_manager_grpc.RunAgentRequest\x1a/.agent_manager_grpc.RunAgentResponseStreamChunk0\x01\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18\x61gent_manager_grpc.proto\x12\x12\x61gent_manager_grpc\"\x93\x07\n\x0fRunAgentRequest\x12\x0e\n\x06prompt\x18\x01 \x01(\t\x12\x12\n\nsession_id\x18\x02 \x01(\t\x12\x17\n\x0fis_chat_request\x18\x03 \x01(\x08\x12\x1c\n\x0frequest_api_key\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x07\x63\x64p_url\x18\x05 \x01(\tH\x01\x88\x01\x01\x12 \n\x13parent_span_context\x18\x06 \x01(\tH\x02\x88\x01\x01\x12>\n\x0emodel_provider\x18\x07 \x01(\x0e\x32!.agent_manager_grpc.ModelProviderH\x03\x88\x01\x01\x12\x12\n\x05model\x18\x08 \x01(\tH\x04\x88\x01\x01\x12\x1c\n\x0f\x65nable_thinking\x18\t \x01(\x08H\x05\x88\x01\x01\x12\x1f\n\x12return_screenshots\x18\n \x01(\x08H\x06\x88\x01\x01\x12\x1f\n\x12return_agent_state\x18\x0b \x01(\x08H\x07\x88\x01\x01\x12!\n\x14return_storage_state\x18\x0c \x01(\x08H\x08\x88\x01\x01\x12\x1a\n\rstorage_state\x18\r \x01(\tH\t\x88\x01\x01\x12\x18\n\x0b\x61gent_state\x18\x0e \x01(\tH\n\x88\x01\x01\x12\x14\n\x07timeout\x18\x0f \x01(\x04H\x0b\x88\x01\x01\x12\x16\n\tmax_steps\x18\x10 \x01(\x04H\x0c\x88\x01\x01\x12\"\n\x15thinking_token_budget\x18\x11 \x01(\x04H\r\x88\x01\x01\x12\x16\n\tstart_url\x18\x12 \x01(\tH\x0e\x88\x01\x01\x12!\n\x14\x64isable_give_control\x18\x13 \x01(\x08H\x0f\x88\x01\x01\x12\x17\n\nuser_agent\x18\x14 \x01(\tH\x10\x88\x01\x01\x42\x12\n\x10_request_api_keyB\n\n\x08_cdp_urlB\x16\n\x14_parent_span_contextB\x11\n\x0f_model_providerB\x08\n\x06_modelB\x12\n\x10_enable_thinkingB\x15\n\x13_return_screenshotsB\x15\n\x13_return_agent_stateB\x17\n\x15_return_storage_stateB\x10\n\x0e_storage_stateB\x0e\n\x0c_agent_stateB\n\n\x08_timeoutB\x0c\n\n_max_stepsB\x18\n\x16_thinking_token_budgetB\x0c\n\n_start_urlB\x17\n\x15_disable_give_controlB\r\n\x0b_user_agent\"\x9c\x01\n\x0c\x41\x63tionResult\x12\x14\n\x07is_done\x18\x01 \x01(\x08H\x00\x88\x01\x01\x12\x14\n\x07\x63ontent\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x12\n\x05\x65rror\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x19\n\x0cgive_control\x18\x04 \x01(\x08H\x03\x88\x01\x01\x42\n\n\x08_is_doneB\n\n\x08_contentB\x08\n\x06_errorB\x0f\n\r_give_control\"\x96\x01\n\x10StepChunkContent\x12\x37\n\raction_result\x18\x01 \x01(\x0b\x32 .agent_manager_grpc.ActionResult\x12\x0f\n\x07summary\x18\x02 \x01(\t\x12\x10\n\x08trace_id\x18\x03 \x01(\t\x12\x17\n\nscreenshot\x18\x04 \x01(\tH\x00\x88\x01\x01\x42\r\n\x0b_screenshot\"\xe3\x01\n\x0b\x41gentOutput\x12\x30\n\x06result\x18\x01 \x01(\x0b\x32 .agent_manager_grpc.ActionResult\x12\x15\n\x08trace_id\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x17\n\nstep_count\x18\x03 \x01(\x04H\x01\x88\x01\x01\x12\x1a\n\rstorage_state\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x18\n\x0b\x61gent_state\x18\x05 \x01(\tH\x03\x88\x01\x01\x42\x0b\n\t_trace_idB\r\n\x0b_step_countB\x10\n\x0e_storage_stateB\x0e\n\x0c_agent_state\"$\n\x11\x45rrorChunkContent\x12\x0f\n\x07\x63ontent\x18\x01 \x01(\t\"\xb5\x02\n\x1bRunAgentResponseStreamChunk\x12\x42\n\x12step_chunk_content\x18\x01 \x01(\x0b\x32$.agent_manager_grpc.StepChunkContentH\x00\x12\x37\n\x0c\x61gent_output\x18\x02 \x01(\x0b\x32\x1f.agent_manager_grpc.AgentOutputH\x00\x12\x44\n\x13\x65rror_chunk_content\x18\x03 \x01(\x0b\x32%.agent_manager_grpc.ErrorChunkContentH\x00\x12\x45\n\x15timeout_chunk_content\x18\x04 \x01(\x0b\x32$.agent_manager_grpc.StepChunkContentH\x00\x42\x0c\n\nchunk_type*C\n\rModelProvider\x12\r\n\tANTHROPIC\x10\x00\x12\x0b\n\x07\x42\x45\x44ROCK\x10\x01\x12\n\n\x06OPENAI\x10\x02\x12\n\n\x06GEMINI\x10\x03\x32\xd1\x01\n\x13\x41gentManagerService\x12P\n\x08RunAgent\x12#.agent_manager_grpc.RunAgentRequest\x1a\x1f.agent_manager_grpc.AgentOutput\x12h\n\x0eRunAgentStream\x12#.agent_manager_grpc.RunAgentRequest\x1a/.agent_manager_grpc.RunAgentResponseStreamChunk0\x01\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'agent_manager_grpc_pb2', _globals) if not _descriptor._USE_C_DESCRIPTORS: DESCRIPTOR._loaded_options = None - _globals['_MODELPROVIDER']._serialized_start=1758 - _globals['_MODELPROVIDER']._serialized_end=1825 + _globals['_MODELPROVIDER']._serialized_start=1858 + _globals['_MODELPROVIDER']._serialized_end=1925 _globals['_RUNAGENTREQUEST']._serialized_start=49 - _globals['_RUNAGENTREQUEST']._serialized_end=864 - _globals['_ACTIONRESULT']._serialized_start=867 - _globals['_ACTIONRESULT']._serialized_end=1023 - _globals['_STEPCHUNKCONTENT']._serialized_start=1026 - _globals['_STEPCHUNKCONTENT']._serialized_end=1176 - _globals['_AGENTOUTPUT']._serialized_start=1179 - _globals['_AGENTOUTPUT']._serialized_end=1406 - _globals['_ERRORCHUNKCONTENT']._serialized_start=1408 - _globals['_ERRORCHUNKCONTENT']._serialized_end=1444 - _globals['_RUNAGENTRESPONSESTREAMCHUNK']._serialized_start=1447 - _globals['_RUNAGENTRESPONSESTREAMCHUNK']._serialized_end=1756 - _globals['_AGENTMANAGERSERVICE']._serialized_start=1828 - _globals['_AGENTMANAGERSERVICE']._serialized_end=2037 + _globals['_RUNAGENTREQUEST']._serialized_end=964 + _globals['_ACTIONRESULT']._serialized_start=967 + _globals['_ACTIONRESULT']._serialized_end=1123 + _globals['_STEPCHUNKCONTENT']._serialized_start=1126 + _globals['_STEPCHUNKCONTENT']._serialized_end=1276 + _globals['_AGENTOUTPUT']._serialized_start=1279 + _globals['_AGENTOUTPUT']._serialized_end=1506 + _globals['_ERRORCHUNKCONTENT']._serialized_start=1508 + _globals['_ERRORCHUNKCONTENT']._serialized_end=1544 + _globals['_RUNAGENTRESPONSESTREAMCHUNK']._serialized_start=1547 + _globals['_RUNAGENTRESPONSESTREAMCHUNK']._serialized_end=1856 + _globals['_AGENTMANAGERSERVICE']._serialized_start=1928 + _globals['_AGENTMANAGERSERVICE']._serialized_end=2137 # @@protoc_insertion_point(module_scope) diff --git a/agent-manager/src/agent_manager_grpc_pb2.pyi b/agent-manager/src/agent_manager_grpc_pb2.pyi index 6377bad2..3076edf5 100644 --- a/agent-manager/src/agent_manager_grpc_pb2.pyi +++ b/agent-manager/src/agent_manager_grpc_pb2.pyi @@ -17,7 +17,7 @@ OPENAI: ModelProvider GEMINI: ModelProvider class RunAgentRequest(_message.Message): - __slots__ = ("prompt", "session_id", "is_chat_request", "request_api_key", "cdp_url", "parent_span_context", "model_provider", "model", "enable_thinking", "return_screenshots", "return_agent_state", "return_storage_state", "storage_state", "agent_state", "timeout", "max_steps", "thinking_token_budget", "start_url") + __slots__ = ("prompt", "session_id", "is_chat_request", "request_api_key", "cdp_url", "parent_span_context", "model_provider", "model", "enable_thinking", "return_screenshots", "return_agent_state", "return_storage_state", "storage_state", "agent_state", "timeout", "max_steps", "thinking_token_budget", "start_url", "disable_give_control", "user_agent") PROMPT_FIELD_NUMBER: _ClassVar[int] SESSION_ID_FIELD_NUMBER: _ClassVar[int] IS_CHAT_REQUEST_FIELD_NUMBER: _ClassVar[int] @@ -36,6 +36,8 @@ class RunAgentRequest(_message.Message): MAX_STEPS_FIELD_NUMBER: _ClassVar[int] THINKING_TOKEN_BUDGET_FIELD_NUMBER: _ClassVar[int] START_URL_FIELD_NUMBER: _ClassVar[int] + DISABLE_GIVE_CONTROL_FIELD_NUMBER: _ClassVar[int] + USER_AGENT_FIELD_NUMBER: _ClassVar[int] prompt: str session_id: str is_chat_request: bool @@ -54,7 +56,9 @@ class RunAgentRequest(_message.Message): max_steps: int thinking_token_budget: int start_url: str - def __init__(self, prompt: _Optional[str] = ..., session_id: _Optional[str] = ..., is_chat_request: bool = ..., request_api_key: _Optional[str] = ..., cdp_url: _Optional[str] = ..., parent_span_context: _Optional[str] = ..., model_provider: _Optional[_Union[ModelProvider, str]] = ..., model: _Optional[str] = ..., enable_thinking: bool = ..., return_screenshots: bool = ..., return_agent_state: bool = ..., return_storage_state: bool = ..., storage_state: _Optional[str] = ..., agent_state: _Optional[str] = ..., timeout: _Optional[int] = ..., max_steps: _Optional[int] = ..., thinking_token_budget: _Optional[int] = ..., start_url: _Optional[str] = ...) -> None: ... + disable_give_control: bool + user_agent: str + def __init__(self, prompt: _Optional[str] = ..., session_id: _Optional[str] = ..., is_chat_request: bool = ..., request_api_key: _Optional[str] = ..., cdp_url: _Optional[str] = ..., parent_span_context: _Optional[str] = ..., model_provider: _Optional[_Union[ModelProvider, str]] = ..., model: _Optional[str] = ..., enable_thinking: bool = ..., return_screenshots: bool = ..., return_agent_state: bool = ..., return_storage_state: bool = ..., storage_state: _Optional[str] = ..., agent_state: _Optional[str] = ..., timeout: _Optional[int] = ..., max_steps: _Optional[int] = ..., thinking_token_budget: _Optional[int] = ..., start_url: _Optional[str] = ..., disable_give_control: bool = ..., user_agent: _Optional[str] = ...) -> None: ... class ActionResult(_message.Message): __slots__ = ("is_done", "content", "error", "give_control") diff --git a/app-server/proto/agent_manager_grpc.proto b/app-server/proto/agent_manager_grpc.proto index 90b2d21b..30f32e36 100644 --- a/app-server/proto/agent_manager_grpc.proto +++ b/app-server/proto/agent_manager_grpc.proto @@ -29,6 +29,8 @@ message RunAgentRequest { optional uint64 max_steps = 16; optional uint64 thinking_token_budget = 17; optional string start_url = 18; + optional bool disable_give_control = 19; + optional string user_agent = 20; } message ActionResult { diff --git a/app-server/src/agent_manager/agent_manager_grpc.rs b/app-server/src/agent_manager/agent_manager_grpc.rs index 01fe5964..b0011ff4 100644 --- a/app-server/src/agent_manager/agent_manager_grpc.rs +++ b/app-server/src/agent_manager/agent_manager_grpc.rs @@ -38,6 +38,10 @@ pub struct RunAgentRequest { pub thinking_token_budget: ::core::option::Option, #[prost(string, optional, tag = "18")] pub start_url: ::core::option::Option<::prost::alloc::string::String>, + #[prost(bool, optional, tag = "19")] + pub disable_give_control: ::core::option::Option, + #[prost(string, optional, tag = "20")] + pub user_agent: ::core::option::Option<::prost::alloc::string::String>, } #[derive(Clone, PartialEq, ::prost::Message)] pub struct ActionResult { diff --git a/app-server/src/agent_manager/agent_manager_impl.rs b/app-server/src/agent_manager/agent_manager_impl.rs index a6de5cda..1642e271 100644 --- a/app-server/src/agent_manager/agent_manager_impl.rs +++ b/app-server/src/agent_manager/agent_manager_impl.rs @@ -1,16 +1,16 @@ use crate::agent_manager::types::ErrorChunkContent; +use super::AgentManagerTrait; use super::agent_manager_grpc::{ - agent_manager_service_client::AgentManagerServiceClient, RunAgentRequest, + RunAgentRequest, agent_manager_service_client::AgentManagerServiceClient, }; use super::types::{AgentOutput, RunAgentResponseStreamChunk}; -use super::AgentManagerTrait; use anyhow::Result; use async_trait::async_trait; use chrono::Utc; use std::pin::Pin; use std::sync::Arc; -use tonic::{transport::Channel, Request}; +use tonic::{Request, transport::Channel}; use uuid::Uuid; #[derive(Clone)] @@ -56,6 +56,8 @@ impl AgentManagerTrait for AgentManagerImpl { max_steps: params.max_steps, thinking_token_budget: params.thinking_token_budget, start_url: params.start_url, + disable_give_control: Some(params.disable_give_control), + user_agent: params.user_agent, }); let response = client.run_agent(request).await?; @@ -85,6 +87,8 @@ impl AgentManagerTrait for AgentManagerImpl { max_steps: params.max_steps, thinking_token_budget: params.thinking_token_budget, start_url: params.start_url, + disable_give_control: Some(params.disable_give_control), + user_agent: params.user_agent, }); match client.run_agent_stream(request).await { diff --git a/app-server/src/agent_manager/mod.rs b/app-server/src/agent_manager/mod.rs index 039cd3e3..4cc57c57 100644 --- a/app-server/src/agent_manager/mod.rs +++ b/app-server/src/agent_manager/mod.rs @@ -38,14 +38,14 @@ pub struct RunAgentParams { pub max_steps: Option, pub thinking_token_budget: Option, pub start_url: Option, + pub disable_give_control: bool, + pub user_agent: Option, } #[async_trait] #[enum_delegate::register] pub trait AgentManagerTrait { - type RunAgentStreamStream: futures_util::stream::Stream< - Item = Result, - >; + type RunAgentStreamStream: futures_util::stream::Stream>; async fn run_agent(&self, params: RunAgentParams) -> Result; diff --git a/app-server/src/agent_manager/worker.rs b/app-server/src/agent_manager/worker.rs index 54a871ff..387b3203 100644 --- a/app-server/src/agent_manager/worker.rs +++ b/app-server/src/agent_manager/worker.rs @@ -4,12 +4,12 @@ use futures_util::StreamExt; use uuid::Uuid; use super::{ + AgentManager, AgentManagerTrait, channel::AgentManagerWorkers, storage_state, types::{ModelProvider, RunAgentResponseStreamChunk}, - AgentManager, AgentManagerTrait, }; -use crate::db::{self, agent_messages::MessageType, DB}; +use crate::db::{self, DB, agent_messages::MessageType}; pub struct RunAgentWorkerOptions { pub model_provider: Option, @@ -22,9 +22,11 @@ pub struct RunAgentWorkerOptions { pub max_steps: Option, pub thinking_token_budget: Option, pub start_url: Option, + pub user_agent: Option, pub return_agent_state: bool, pub return_storage_state: bool, pub return_screenshots: bool, + pub disable_give_control: bool, } pub async fn run_agent_worker( @@ -84,6 +86,8 @@ pub async fn run_agent_worker( return_agent_state: options.return_agent_state, return_screenshots: options.return_screenshots, return_storage_state: options.return_storage_state, + disable_give_control: options.disable_give_control, + user_agent: options.user_agent, }) .await; diff --git a/app-server/src/api/v1/agent.rs b/app-server/src/api/v1/agent.rs index 1cd54c64..d64eb00b 100644 --- a/app-server/src/api/v1/agent.rs +++ b/app-server/src/api/v1/agent.rs @@ -1,19 +1,19 @@ use std::sync::Arc; -use actix_web::{post, web, HttpResponse}; +use actix_web::{HttpResponse, post, web}; use futures_util::StreamExt; use serde::Deserialize; use uuid::Uuid; +use crate::agent_manager::RunAgentParams; use crate::agent_manager::channel::AgentManagerWorkers; use crate::agent_manager::types::RunAgentResponseStreamChunk; -use crate::agent_manager::worker::{run_agent_worker, RunAgentWorkerOptions}; -use crate::agent_manager::RunAgentParams; -use crate::agent_manager::{types::ModelProvider, AgentManager, AgentManagerTrait}; +use crate::agent_manager::worker::{RunAgentWorkerOptions, run_agent_worker}; +use crate::agent_manager::{AgentManager, AgentManagerTrait, types::ModelProvider}; use crate::cache::Cache; use crate::db::project_api_keys::ProjectApiKey; use crate::db::{self, DB}; -use crate::features::{is_feature_enabled, Feature}; +use crate::features::{Feature, is_feature_enabled}; use crate::routes::types::ResponseResult; use crate::traces::limits::get_workspace_limit_exceeded_by_project_id; @@ -34,6 +34,8 @@ struct RunAgentRequest { #[serde(default)] return_screenshots: bool, #[serde(default)] + disable_give_control: bool, + #[serde(default)] return_agent_state: bool, #[serde(default)] return_storage_state: bool, @@ -51,6 +53,8 @@ struct RunAgentRequest { thinking_token_budget: Option, #[serde(default)] start_url: Option, + #[serde(default)] + user_agent: Option, } fn default_true() -> bool { @@ -127,6 +131,8 @@ pub async fn run_agent_manager( return_screenshots: request.return_screenshots, return_agent_state: request.return_agent_state, return_storage_state: request.return_storage_state, + disable_give_control: request.disable_give_control, + user_agent: request.user_agent, }; let pool = db.pool.clone(); let worker_states_clone = worker_states.clone(); @@ -210,6 +216,8 @@ pub async fn run_agent_manager( max_steps: request.max_steps, thinking_token_budget: request.thinking_token_budget, start_url: request.start_url, + disable_give_control: request.disable_give_control, + user_agent: request.user_agent, return_agent_state: request.return_agent_state, return_storage_state: request.return_storage_state, return_screenshots: request.return_screenshots, diff --git a/app-server/src/routes/agent.rs b/app-server/src/routes/agent.rs index d3e2f70a..beeded32 100644 --- a/app-server/src/routes/agent.rs +++ b/app-server/src/routes/agent.rs @@ -1,18 +1,18 @@ use std::env; use std::sync::Arc; -use actix_web::{post, web, HttpResponse}; +use actix_web::{HttpResponse, post, web}; use futures_util::StreamExt; use serde::Deserialize; use uuid::Uuid; use crate::agent_manager::channel::AgentManagerWorkers; use crate::agent_manager::types::RunAgentResponseStreamChunk; -use crate::agent_manager::worker::{run_agent_worker, RunAgentWorkerOptions}; +use crate::agent_manager::worker::{RunAgentWorkerOptions, run_agent_worker}; use crate::db; use crate::routes::types::ResponseResult; use crate::{ - agent_manager::{types::ModelProvider, AgentManager}, + agent_manager::{AgentManager, types::ModelProvider}, db::DB, }; @@ -33,6 +33,9 @@ struct RunAgentRequest { #[serde(default)] /// If true, we start the agent from scratch; otherwise, we connect to the existing stream is_new_user_message: bool, + + #[serde(default)] + start_url: Option, } fn default_true() -> bool { @@ -70,16 +73,18 @@ pub async fn run_agent_manager( model_provider: request.model_provider, model: request.model, enable_thinking: request.enable_thinking, + start_url: request.start_url, agent_state: None, storage_state: None, timeout: None, cdp_url: None, max_steps: None, thinking_token_budget: None, - start_url: None, return_agent_state: true, return_storage_state: true, return_screenshots: false, + disable_give_control: false, + user_agent: None, }; // Run agent worker let worker_channel_clone = worker_channel.clone();