mirror of
https://github.com/openai/codex.git
synced 2026-04-28 02:11:08 +03:00
80 lines
2.5 KiB
Rust
80 lines
2.5 KiB
Rust
use serde::Deserialize;
|
|
use serde::Serialize;
|
|
|
|
#[derive(Debug, Clone, Serialize, PartialEq)]
|
|
pub struct ResponsesApiTool {
|
|
pub name: String,
|
|
pub description: String,
|
|
/// TODO: Validation. When strict is set to true, the JSON schema,
|
|
/// `required` and `additional_properties` must be present. All fields in
|
|
/// `properties` must be present in `required`.
|
|
pub strict: bool,
|
|
pub parameters: JsonSchema,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
|
|
pub struct FreeformTool {
|
|
pub name: String,
|
|
pub description: String,
|
|
pub format: FreeformToolFormat,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
|
|
pub struct FreeformToolFormat {
|
|
pub r#type: String,
|
|
pub syntax: String,
|
|
pub definition: String,
|
|
}
|
|
|
|
/// Generic JSON-Schema subset needed for our tool definitions
|
|
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
|
|
#[serde(tag = "type", rename_all = "lowercase")]
|
|
pub enum JsonSchema {
|
|
Boolean {
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
description: Option<String>,
|
|
},
|
|
String {
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
description: Option<String>,
|
|
},
|
|
/// MCP schema allows "number" | "integer" for Number
|
|
#[serde(alias = "integer")]
|
|
Number {
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
description: Option<String>,
|
|
},
|
|
Array {
|
|
items: Box<JsonSchema>,
|
|
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
description: Option<String>,
|
|
},
|
|
Object {
|
|
properties: std::collections::BTreeMap<String, JsonSchema>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
required: Option<Vec<String>>,
|
|
#[serde(
|
|
rename = "additionalProperties",
|
|
skip_serializing_if = "Option::is_none"
|
|
)]
|
|
additional_properties: Option<bool>,
|
|
},
|
|
}
|
|
|
|
/// When serialized as JSON, this produces a valid "Tool" in the OpenAI Responses API.
|
|
#[derive(Debug, Clone, Serialize, PartialEq)]
|
|
#[serde(tag = "type")]
|
|
pub enum OpenAiTool {
|
|
#[serde(rename = "function")]
|
|
Function(ResponsesApiTool),
|
|
#[serde(rename = "local_shell")]
|
|
LocalShell {},
|
|
// TODO: Understand why we get an error on web_search although the API docs say it's supported.
|
|
// https://platform.openai.com/docs/guides/tools-web-search?api-mode=responses#:~:text=%7B%20type%3A%20%22web_search%22%20%7D%2C
|
|
#[serde(rename = "web_search")]
|
|
WebSearch {},
|
|
#[serde(rename = "custom")]
|
|
Freeform(FreeformTool),
|
|
}
|