agent_io/llm/openai/
types.rs1use serde::{Deserialize, Serialize};
4
5use crate::llm::ToolCall;
6
7#[derive(Debug, Clone, Serialize, Deserialize, Default)]
9#[serde(rename_all = "lowercase")]
10pub enum ReasoningEffort {
11 Low,
12 Medium,
13 High,
14 #[default]
15 Minimal,
16}
17
18#[derive(Serialize)]
20pub struct OpenAIRequest {
21 pub model: String,
22 pub messages: Vec<OpenAIMessage>,
23 #[serde(skip_serializing_if = "Option::is_none")]
24 pub tools: Option<Vec<OpenAITool>>,
25 #[serde(skip_serializing_if = "Option::is_none")]
26 pub tool_choice: Option<serde_json::Value>,
27 #[serde(skip_serializing_if = "Option::is_none")]
28 pub temperature: Option<f32>,
29 #[serde(skip_serializing_if = "Option::is_none")]
30 pub max_completion_tokens: Option<u64>,
31 #[serde(skip_serializing_if = "Option::is_none")]
32 pub reasoning_effort: Option<ReasoningEffort>,
33 #[serde(skip_serializing_if = "Option::is_none")]
34 pub stream: Option<bool>,
35}
36
37#[derive(Serialize)]
38pub struct OpenAIMessage {
39 pub role: String,
40 #[serde(skip_serializing_if = "Option::is_none")]
41 pub content: Option<serde_json::Value>,
42 #[serde(skip_serializing_if = "Option::is_none")]
43 pub name: Option<String>,
44 #[serde(skip_serializing_if = "Option::is_none")]
45 pub tool_calls: Option<Vec<ToolCall>>,
46 #[serde(skip_serializing_if = "Option::is_none")]
47 pub tool_call_id: Option<String>,
48}
49
50#[derive(Serialize)]
51pub struct OpenAITool {
52 #[serde(rename = "type")]
53 pub tool_type: String,
54 pub function: OpenAIFunction,
55}
56
57#[derive(Serialize)]
58pub struct OpenAIFunction {
59 pub name: String,
60 pub description: String,
61 pub parameters: serde_json::Map<String, serde_json::Value>,
62 pub strict: bool,
63}
64
65#[derive(Deserialize)]
67pub struct OpenAIResponse {
68 pub choices: Vec<OpenAIChoice>,
69 pub usage: Option<OpenAIUsage>,
70}
71
72#[derive(Deserialize)]
73pub struct OpenAIChoice {
74 pub message: OpenAIMessageResponse,
75 pub finish_reason: Option<String>,
76}
77
78#[derive(Deserialize)]
79pub struct OpenAIMessageResponse {
80 pub content: Option<String>,
81 pub tool_calls: Option<Vec<ToolCall>>,
82 pub reasoning_content: Option<String>,
83}
84
85#[derive(Deserialize)]
86pub struct OpenAIUsage {
87 pub prompt_tokens: u64,
88 pub completion_tokens: u64,
89 pub total_tokens: u64,
90 #[serde(default)]
91 pub prompt_tokens_details: Option<OpenAIPromptTokenDetails>,
92}
93
94#[derive(Deserialize, Default)]
95pub struct OpenAIPromptTokenDetails {
96 pub cached_tokens: u64,
97}