Rust SDK
Resmi Rust Moonborn istemcisi. Eşzamansız öncelikli (async-first, Tokio), serde-türlü, futures::Stream tabanlı. Her API sürümünden bir hafta içinde yayımlanır.
moonborn (crates.io) — resmi Rust SDK'sıdır. Kanonik OpenAPI belirtiminden üretilir; deyimsel Rust:
- Eşzamansız öncelikli (async-first) (Tokio çalışma zamanı)
- Serde-türlü istek + yanıt struct'ları
- Akış için
futures::Stream - Türlü hata (typed error) (
Error::Api(APIError),Error::Network, ...)
Bu sayfayı bitirdiğinde
- Rust SDK'sını kurabilecek ve başlatabileceksin.
- Eşzamansız persona oluşturma + sohbet çağırabileceksin.
futures::Streamakış desenini kullanabileceksin.- Hata işleme ile
matchifadesi yazabileceksin.
Ön koşul: Rust 1.75+, Tokio çalışma zamanı, API anahtarı.
Kurulum
Cargo.toml:
[dependencies]
moonborn = "1.0"
tokio = { version = "1", features = ["full"] }
futures = "0.3"cargo buildBaşlatma
use moonborn::{Client, CreatePersonaInput, Result};
use std::env;
#[tokio::main]
async fn main() -> Result<()> {
let client = Client::new(env::var("MOONBORN_API_KEY")?);
// veya:
// let client = Client::builder()
// .api_key(env::var("MOONBORN_API_KEY")?)
// .base_url("https://api.moonborn.co") // kendi sunucuna kurulum
// .timeout(Duration::from_secs(60))
// .build()?;
let persona = client.personas()
.create_persona(CreatePersonaInput {
intent: "İstanbul'dan 34 yaşında bir kurucu. Parlak ama huzursuz.".into(),
workspace_id: "ws_...".into(),
..Default::default()
})
.await?;
println!("{} {}", persona.id, persona.status);
Ok(())
}Akışlı sohbet
use futures::StreamExt;
use moonborn::{StreamMessageInput, Chunk};
let session = client.chat().create_session(/* ... */).await?;
let mut stream = client.chat()
.stream_message(StreamMessageInput {
session_id: session.id.clone(),
content: "Sessiz bir gerçek söyle.".into(),
})
.await?;
while let Some(chunk) = stream.next().await {
match chunk? {
Chunk::Token { delta } => print!("{}", delta),
Chunk::Completed { drift_score, .. } => {
println!("\ndrift: {}", drift_score);
}
Chunk::Error { error } => {
eprintln!("stream error: {}", error);
}
}
}stream bir impl Stream<Item = Result<Chunk>> türündedir — futures::StreamExt::next() ile yinelenir.
Üretim hattı akışı
use moonborn::Event;
let mut stream = client.personas()
.create_persona_stream(CreatePersonaInput {
intent: "Lagos'ta bir market satıcısı.".into(),
..Default::default()
})
.await?;
while let Some(event) = stream.next().await {
match event? {
Event::StepStarted { step } => println!("Başladı: {}", step),
Event::StepCompleted { step, duration_ms } => {
println!("Bitti: {} ({}ms)", step, duration_ms);
}
Event::PipelineCompleted { persona_id, .. } => {
println!("Persona: {}", persona_id);
}
}
}Hata işleme
use moonborn::{Error, GetPersonaInput};
match client.personas().get_persona(GetPersonaInput {
id: "per_...".into()
}).await {
Ok(persona) => {
println!("{}", persona.id);
}
Err(Error::Api(api_err)) => {
match api_err.code.as_str() {
"rate_limited" => {
let wait = api_err.retry_after.unwrap_or(Duration::from_secs(1));
tokio::time::sleep(wait).await;
// yeniden dene
}
"not_found" => {
eprintln!("persona missing");
}
"validation_failed" => {
eprintln!("invalid body: {:?}", api_err.details);
}
_ => return Err(Error::Api(api_err).into()),
}
}
Err(Error::Network(e)) => {
eprintln!("network: {}", e);
}
Err(e) => return Err(e.into()),
}14 hata kodunun tümü: Hatalar.
Otomatik yeniden deneme
İstemci 5xx + 429'da üstel geri çekilme ile otomatik yeniden deneme yapar:
use moonborn::{Client, RetryConfig};
use std::time::Duration;
let client = Client::builder()
.api_key(env::var("MOONBORN_API_KEY")?)
.retry_config(RetryConfig {
max_retries: 5,
initial_wait: Duration::from_millis(500),
max_wait: Duration::from_secs(30),
})
.build()?;Eşgüçlülük (idempotency)
use moonborn::RequestOptions;
let persona = client.personas()
.create_persona_with_options(
CreatePersonaInput { intent: "...".into(), ..Default::default() },
RequestOptions::default()
.with_idempotency_key("persona-build-2026-05-17-mert"),
)
.await?;Tokio çalışma zamanı gereksinimi
SDK Tokio çalışma zamanı gerektirir — Cargo'da tokio = { version = "1", features = ["full"] } zorunludur. async-std veya smol desteklenmez.
#[tokio::main]
async fn main() { /* ... */ }
// veya elle:
let rt = tokio::runtime::Runtime::new()?;
rt.block_on(async { /* ... */ });Sık karşılaşılan hatalar
error: no Tokio runtime
Eşzamansız kodu Tokio çalışma zamanı dışında çağırıyorsun. #[tokio::main] ekle veya tokio::runtime::Runtime::new() ile elle başlat.
Akış sırasında "connection closed"
Client örneği düştü (drop edildi). Akış devam ederken istemciyi kapsam (scope) içinde tut.
Plan gereksinimi
Her plan.