core/src/tools/handlers/view_image_spec.rs
69 lines
use codex_protocol::models::VIEW_IMAGE_TOOL_NAME;use codex_tools::JsonSchema;use codex_tools::ResponsesApiTool;use codex_tools::ToolSpec;use serde_json::Value;use serde_json::json;use std::collections::BTreeMap;#[derive(Debug, Clone, Copy, PartialEq, Eq)]pub struct ViewImageToolOptions { pub can_request_original_image_detail: bool, pub include_environment_id: bool,}pub fn create_view_image_tool(options: ViewImageToolOptions) -> ToolSpec { let mut properties = BTreeMap::from([( "path".to_string(), JsonSchema::string(Some("Local filesystem path to an image file.".to_string())), )]); if options.can_request_original_image_detail { properties.insert( "detail".to_string(), JsonSchema::string_enum( vec![json!("high"), json!("original")], Some( "Image detail level. Defaults to `high`; use `original` to preserve exact resolution.".to_string(), ), ), ); } if options.include_environment_id { properties.insert( "environment_id".to_string(), JsonSchema::string(Some( "Environment id from <environment_context>. Omit to use the primary environment." .to_string(), )), ); } ToolSpec::Function(ResponsesApiTool { name: VIEW_IMAGE_TOOL_NAME.to_string(), description: "View a local image file from the filesystem when visual inspection is needed. Use this for images already available on disk." .to_string(), strict: false, defer_loading: None, parameters: JsonSchema::object(properties, Some(vec!["path".to_string()]), Some(false.into())), output_schema: Some(view_image_output_schema()), })}fn view_image_output_schema() -> Value { json!({ "type": "object", "properties": { "image_url": { "type": "string", "description": "Data URL for the loaded image." }, "detail": { "type": "string", "enum": ["high", "original"], "description": "Image detail hint returned by view_image. Returns `high` for default resized behavior or `original` when original resolution is preserved." } }, "required": ["image_url", "detail"], "additionalProperties": false })}