Uygulamayı aç
Moonborn — Developers

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::Stream akış desenini kullanabileceksin.
  • Hata işleme ile match ifadesi 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 build

Baş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.

İlgili

Go SDK

Bağlam tabanlı (context-based) ekosistem ile karşılaştırma.

Open →
TypeScript SDK

AsyncIterable akış karşılaştırması.

Open →
Hatalar

APIError kod kataloğu.

Open →
Akış desenleri

SSE olay şekli + iptal.

Open →