use std::env; use agcore::init_tracing; use agcore::llm::{ cycle::{CycleConfig, LlmCycle}, provider::openai::OpenaiProvider, types::{ChatResponse, OpenaiContentPart}, }; fn extract_response_text(response: &ChatResponse) -> &str { match &response.message { agcore::llm::types::OpenaiChatMessage::Assistant { content, .. } => match content { agcore::llm::types::ContentField::String(s) => s, agcore::llm::types::ContentField::Array(parts) => { for part in parts { if let OpenaiContentPart::Text { text } = part { return text; } } "[无文本内容]" } }, _ => "[非 assistant 消息]", } } #[tokio::main] async fn main() { dotenvy::dotenv().ok(); init_tracing(); let api_key = env::var("OPENAI_API_KEY").expect("未设置 OPENAI_API_KEY 环境变量"); let base_url = env::var("OPENAI_BASE_URL").expect("未设置 OPENAI_BASE_URL 环境变量"); let model = env::var("OPENAI_MODEL").expect("未设置 OPENAI_MODEL 环境变量选择所要使用的模型"); let provider = OpenaiProvider::new(base_url, api_key, model.clone()); let config = CycleConfig { model, max_tokens: Some(65536), temperature: Some(1.3), ..CycleConfig::default() }; let mut cycle = LlmCycle::new(Box::new(provider), config) .with_system_prompt("你是一个简洁的助手,对于任何问题都是用一句话回答。".to_string()); println!("发送请求..."); match cycle.submit("介绍一下你自己吧。".to_string(), vec![]).await { Ok(response) => { println!("LLM 回复:{}", extract_response_text(&response)); println!( "Token 用量:{} 输入, {} 输出", response.usage.prompt_tokens, response.usage.completion_tokens ); } Err(e) => { eprintln!("请求失败:{e}"); std::process::exit(1); } } }