objectiveai_sdk/cli/command/agents/message/
mod.rs1use crate::agent::completions::message::RichContent;
13use crate::cli::command::CommandRequest;
14use crate::cli::command::agents::selector::AgentSelector;
15
16#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize, schemars::JsonSchema)]
17#[schemars(rename = "cli.command.agents.message.Request")]
18pub struct Request {
19 pub path_type: Path,
20 pub agent: AgentSelector,
27 pub message: RequestMessage,
31 #[serde(default, skip_serializing_if = "Option::is_none")]
32 #[schemars(extend("omitempty" = true))]
33 pub dangerous_advanced: Option<RequestDangerousAdvanced>,
34 #[serde(flatten)]
35 pub base: crate::cli::command::RequestBase,
36}
37
38#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize, schemars::JsonSchema)]
39#[schemars(rename = "cli.command.agents.message.Path")]
40pub enum Path {
41 #[serde(rename = "agents/message")]
42 AgentsMessage,
43}
44
45#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize, schemars::JsonSchema)]
46#[schemars(rename = "cli.command.agents.message.RequestMessage")]
47pub enum RequestMessage {
48 #[schemars(title = "Inline")]
49 Inline(RichContent),
50 #[schemars(title = "Simple")]
51 Simple(String),
52 #[schemars(title = "File")]
53 File(std::path::PathBuf),
54 #[schemars(title = "PythonInline")]
55 PythonInline(String),
56 #[schemars(title = "PythonFile")]
57 PythonFile(std::path::PathBuf),
58}
59
60impl RequestMessage {
61 pub fn push_flags(&self, out: &mut Vec<String>) {
67 match self {
68 RequestMessage::Inline(rich) => {
69 out.push("--inline".to_string());
70 out.push(
71 serde_json::to_string(rich)
72 .expect("RichContent serializes to JSON cleanly"),
73 );
74 }
75 RequestMessage::Simple(s) => {
76 out.push("--simple".to_string());
77 out.push(s.clone());
78 }
79 RequestMessage::File(p) => {
80 out.push("--file".to_string());
81 out.push(p.to_string_lossy().into_owned());
82 }
83 RequestMessage::PythonInline(code) => {
84 out.push("--python-inline".to_string());
85 out.push(code.clone());
86 }
87 RequestMessage::PythonFile(p) => {
88 out.push("--python-file".to_string());
89 out.push(p.to_string_lossy().into_owned());
90 }
91 }
92 }
93}
94
95#[derive(Debug, Clone, Default, PartialEq, Eq, serde::Serialize, serde::Deserialize, schemars::JsonSchema)]
96#[schemars(rename = "cli.command.agents.message.RequestDangerousAdvanced")]
97pub struct RequestDangerousAdvanced {
98 #[serde(default, skip_serializing_if = "Option::is_none")]
103 #[schemars(extend("omitempty" = true))]
104 pub seed: Option<i64>,
105}
106
107impl CommandRequest for Request {
108 fn request_base(&self) -> &crate::cli::command::RequestBase {
109 &self.base
110 }
111
112 fn request_base_mut(&mut self) -> Option<&mut crate::cli::command::RequestBase> {
113 Some(&mut self.base)
114 }
115}
116
117#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize, schemars::JsonSchema)]
121#[serde(tag = "type", rename_all = "snake_case")]
122#[schemars(rename = "cli.command.agents.message.Response")]
123pub enum Response {
124 #[schemars(title = "Delivered")]
128 Delivered,
129 #[schemars(title = "Id")]
134 Id { agent_instance_hierarchy: String },
135}
136
137#[derive(clap::Args)]
138pub struct Args {
139 #[command(flatten)]
140 pub agent: crate::cli::command::agents::selector::AgentSelectorArgs,
141 #[command(flatten)]
142 pub message: MessageArgs,
143 #[arg(long)]
146 pub dangerous_advanced: Option<String>,
147 #[command(flatten)]
148 pub base: crate::cli::command::RequestBaseArgs,
149}
150
151#[derive(clap::Args)]
152#[group(required = true, multiple = false)]
153pub struct MessageArgs {
154 #[arg(long)]
156 pub simple: Option<String>,
157 #[arg(long)]
159 pub inline: Option<String>,
160 #[arg(long)]
162 pub file: Option<std::path::PathBuf>,
163 #[arg(long)]
165 pub python_inline: Option<String>,
166 #[arg(long)]
168 pub python_file: Option<std::path::PathBuf>,
169}
170
171#[derive(clap::Args)]
172#[command(args_conflicts_with_subcommands = true)]
173pub struct Command {
174 #[command(flatten)]
175 pub args: Args,
176 #[command(subcommand)]
177 pub schema: Option<Schema>,
178}
179
180#[derive(clap::Subcommand)]
181pub enum Schema {
182 RequestSchema(request_schema::Args),
184 ResponseSchema(response_schema::Args),
186}
187
188impl TryFrom<Args> for Request {
189 type Error = crate::cli::command::FromArgsError;
190 fn try_from(args: Args) -> Result<Self, Self::Error> {
191 let message = if let Some(s) = args.message.simple {
192 RequestMessage::Simple(s)
193 } else if let Some(s) = args.message.inline {
194 let mut de = serde_json::Deserializer::from_str(&s);
195 let v = serde_path_to_error::deserialize(&mut de).map_err(|source| {
196 crate::cli::command::FromArgsError {
197 field: "inline",
198 source: source.into(),
199 }
200 })?;
201 RequestMessage::Inline(v)
202 } else if let Some(p) = args.message.file {
203 RequestMessage::File(p)
204 } else if let Some(s) = args.message.python_inline {
205 RequestMessage::PythonInline(s)
206 } else {
207 RequestMessage::PythonFile(args.message.python_file.unwrap())
210 };
211 let agent = AgentSelector::try_from(args.agent)?;
212 let dangerous_advanced: Option<RequestDangerousAdvanced> =
213 if let Some(s) = args.dangerous_advanced {
214 let mut de = serde_json::Deserializer::from_str(&s);
215 let v = serde_path_to_error::deserialize(&mut de).map_err(|source| {
216 crate::cli::command::FromArgsError {
217 field: "dangerous_advanced",
218 source: source.into(),
219 }
220 })?;
221 Some(v)
222 } else {
223 None
224 };
225 Ok(Self {
226 path_type: Path::AgentsMessage,
227 agent,
228 message,
229 dangerous_advanced,
230 base: args.base.into(),
231 })
232 }
233}
234
235#[cfg(feature = "cli-executor")]
236pub async fn execute<E: crate::cli::command::CommandExecutor>(
237 executor: &E,
238 mut request: Request,
239
240 agent_arguments: Option<&crate::cli::command::AgentArguments>,
241 ) -> Result<Response, E::Error> {
242 request.base.clear_transform();
243 executor.execute_one(request, agent_arguments).await
244}
245
246#[cfg(feature = "cli-executor")]
247pub async fn execute_transform<E: crate::cli::command::CommandExecutor>(
248 executor: &E,
249 mut request: Request,
250 transform: crate::cli::command::Transform,
251
252 agent_arguments: Option<&crate::cli::command::AgentArguments>,
253 ) -> Result<serde_json::Value, E::Error> {
254 request.base.set_transform(transform);
255 executor.execute_one(request, agent_arguments).await
256}
257
258#[cfg(feature = "mcp")]
259impl crate::cli::command::CommandResponse for Response {
260 fn into_mcp(self) -> crate::cli::command::McpResponseItem {
261 crate::cli::command::McpResponseItem::JSONL(serde_json::to_value(self).unwrap())
262 }
263}
264
265pub mod request_schema;
266
267
268pub mod response_schema;