focus/crates/focus-providers/tests/zai_smoke.rs

62 lines
2.2 KiB
Rust

//! 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=<your-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");
}