//! Smoke test that makes a REAL call to Z.ai / 智谱. //! //! Ignored by default — it costs tokens and needs network + an API key. To run: //! //! ```bash //! ZAI_API_KEY= cargo test -p focus-providers --test zai_smoke -- --ignored --nocapture //! ``` //! //! It prompts the model in Chinese and asserts a non-empty response is streamed. #![cfg(test)] use focus_core::model::*; use focus_core::provider::{ProviderRequest, StreamEvent}; use focus_core::StreamProvider; use focus_json::JsonValue; use focus_providers::{ProviderConfig, ZaiProvider}; #[tokio::test] #[ignore] async fn zai_domestic_streams_chinese_response() { let api_key = std::env::var("ZAI_API_KEY").expect("set ZAI_API_KEY to run this test"); let model = std::env::var("ZAI_MODEL").unwrap_or_else(|_| "glm-4.6".to_string()); let provider = ZaiProvider::domestic(&api_key, &model); let req = ProviderRequest { model: model.clone(), system_prompt: "你是一个简洁的助手。".into(), messages: vec![Message::user_text("用一句话介绍你自己。")], tools: JsonValue::arr(), max_tokens: Some(256), temperature: Some(0.7), }; let mut iter = provider.stream(&req).expect("stream failed"); let mut text = String::new(); let mut got_done = false; while let Some(ev) = iter.next_event() { match ev { StreamEvent::TextDelta { delta, .. } => text.push_str(&delta), StreamEvent::Done { .. } => got_done = true, StreamEvent::Error { error } => { panic!("provider error: {:?}", error.error_message); } _ => {} } } assert!(got_done, "stream did not emit Done"); assert!(!text.is_empty(), "no text streamed back"); eprintln!("Z.ai response: {}", text); } #[test] #[ignore] fn zai_config_builder_uses_domestic_host() { // No network — just verifies the builder wires the right host. let api_key = std::env::var("ZAI_API_KEY").unwrap_or_default(); let p = ZaiProvider::domestic(&api_key, "glm-4.6"); assert_eq!(p.inner().config_ref().base_url, "open.bigmodel.cn"); let _cfg = ProviderConfig::zai_cn("k", "m"); }