use text_video_agent_client::apis::configuration::Configuration; use text_video_agent_client::apis::llm_api; use std::path::PathBuf; use std::fs; #[tokio::main] async fn main() -> Result<(), Box> { // 创建支持 HTTPS 的客户端 let client = reqwest::Client::builder() .timeout(std::time::Duration::from_secs(30)) .build()?; // 创建配置 let config = Configuration { base_path: "https://bowongai-dev--text-video-agent-fastapi-app.modal.run".to_string(), user_agent: Some("text-video-agent-rust-client/1.0.6".to_string()), client, basic_auth: None, oauth_access_token: None, bearer_access_token: None, api_key: None, }; println!("📁 文件上传和媒体分析测试"); println!("=========================="); println!("API 地址: {}", config.base_path); println!(); // 创建一个测试文本文件 let test_file_path = "test_file.txt"; let test_content = "这是一个测试文件,用于验证文件上传功能。\nThis is a test file for verifying file upload functionality."; println!("📝 创建测试文件: {}", test_file_path); fs::write(test_file_path, test_content)?; println!("✅ 测试文件创建成功"); println!(); // 1. 测试文件上传到 Google 存储 println!("☁️ 测试文件上传到 Google 存储..."); let file_path = PathBuf::from(test_file_path); match llm_api::google_file_upload(&config, file_path.clone()).await { Ok(response) => { println!("✅ 文件上传成功: {}", response); // 尝试从响应中提取文件URI if let Some(data) = response.get("data").and_then(|v| v.as_str()) { println!("📎 文件URI: {}", data); // 2. 使用上传的文件进行媒体分析 println!(); println!("🔍 测试媒体分析(同步)..."); let analysis_prompts = vec![ "请分析这个文件的内容", "这个文件包含什么信息?", "请总结文件的主要内容", ]; for (i, prompt) in analysis_prompts.iter().enumerate() { println!("🔸 分析 {}: {}", i + 1, prompt); match llm_api::invoke_media_analysis_api_llm_google_sync_media_analysis_post( &config, prompt, data, // 使用上传后的文件URI ).await { Ok(analysis_response) => { println!("✅ 分析结果: {}", analysis_response); } Err(e) => { println!("❌ 分析失败: {:?}", e); } } println!(); // 添加延迟 tokio::time::sleep(tokio::time::Duration::from_secs(2)).await; } // 3. 测试异步媒体分析 println!("⚡ 测试媒体分析(异步)..."); let async_prompt = "请详细分析这个文件,包括语言、内容主题和结构"; match llm_api::submit_media_inference_api_llm_google_async_media_analysis_post( &config, async_prompt, data, ).await { Ok(async_response) => { println!("✅ 异步分析任务提交成功: {}", async_response); // 尝试获取任务ID if let Some(task_id) = async_response.get("task_id").and_then(|v| v.as_str()) { println!("📋 任务ID: {}", task_id); // 轮询任务状态 println!("⏳ 查询任务状态..."); for attempt in 1..=5 { tokio::time::sleep(tokio::time::Duration::from_secs(5)).await; match llm_api::llm_task_id(&config, task_id).await { Ok(status_response) => { println!("📊 第{}次查询 - 任务状态: {}", attempt, status_response); // 检查任务是否完成 if let Some(status) = status_response.get("status") { if status.is_boolean() && status.as_bool() == Some(true) { println!("🎉 异步分析任务完成!"); if let Some(data) = status_response.get("data") { println!("📄 分析结果: {}", data); } break; } } } Err(e) => { println!("❌ 查询状态失败: {:?}", e); } } } } } Err(e) => { println!("❌ 异步分析任务提交失败: {:?}", e); } } } } Err(e) => { println!("❌ 文件上传失败: {:?}", e); } } println!(); // 4. 测试不同类型的媒体URI分析 println!("🌐 测试在线媒体分析..."); let online_media_tests = vec![ ("https://example.com/sample.jpg", "请描述这张图片的内容"), ("https://example.com/sample.mp4", "请分析这个视频的主要内容"), ("https://example.com/sample.mp3", "请分析这个音频文件"), ]; for (media_uri, prompt) in online_media_tests.iter() { println!("🔗 分析媒体: {}", media_uri); println!("❓ 提示: {}", prompt); match llm_api::invoke_media_analysis_api_llm_google_sync_media_analysis_post( &config, prompt, media_uri, ).await { Ok(response) => { println!("✅ 分析结果: {}", response); } Err(e) => { println!("❌ 分析失败: {:?}", e); } } println!(); tokio::time::sleep(tokio::time::Duration::from_secs(2)).await; } // 清理测试文件 println!("🧹 清理测试文件..."); if let Err(e) = fs::remove_file(test_file_path) { println!("⚠️ 删除测试文件失败: {}", e); } else { println!("✅ 测试文件已删除"); } println!("🎯 文件上传和媒体分析测试完成!"); Ok(()) }