Skip to main content

agent_io/llm/openai/
types.rs

1//! OpenAI API types
2
3use serde::{Deserialize, Serialize};
4
5use crate::llm::ToolCall;
6
7/// Reasoning effort levels for o1+ models
8#[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/// OpenAI API request
19#[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/// OpenAI API response
66#[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}