rustglm 1.0.0

Production-oriented async Rust SDK for Zhipu GLM, Realtime, Batch, RAG, and MCP
Documentation
use std::fs;
use std::io::{self, Write};

use rustglm::{Glm4VoiceRequest, ZhipuClient};

fn read_line(prompt: &str) -> io::Result<String> {
    print!("{prompt}");
    io::stdout().flush()?;
    let mut value = String::new();
    io::stdin().read_line(&mut value)?;
    Ok(value.trim().to_owned())
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let api_key = match std::env::var("ZHIPU_API_KEY") {
        Ok(value) if !value.trim().is_empty() => value,
        _ => read_line("请输入智谱 API Key(输入内容会显示): ")?,
    };
    let input_path = read_line("请输入 WAV 输入文件路径: ")?;
    let prompt = match read_line("语音指令,直接回车使用 慢速复述这段语音: ")? {
        value if value.is_empty() => "慢速复述这段语音".to_owned(),
        value => value,
    };
    let output_path = match read_line("输出文件,直接回车使用 glm-4-voice-output.wav: ")?
    {
        value if value.is_empty() => "glm-4-voice-output.wav".to_owned(),
        value => value,
    };
    let wav = fs::read(&input_path)?;
    if wav.len() < 12 || &wav[..4] != b"RIFF" || &wav[8..12] != b"WAVE" {
        return Err("输入文件不是有效的 RIFF/WAVE 文件".into());
    }
    let client = ZhipuClient::new(api_key)?;
    let response = client
        .glm_4_voice(&Glm4VoiceRequest::from_wav(prompt, &wav)?)
        .await?;
    println!("文本响应: {}", response.text().unwrap_or_default());
    let output = response.audio_wav()?.ok_or("响应中没有音频数据")?;
    fs::write(&output_path, output)?;
    println!("已保存 44.1kHz 单声道 PCM16 WAV: {output_path}");
    Ok(())
}