Luigit
repositories / smith

smith

There are many coding harnesses - but this one is fast

owned by admin

smith-harness/src/lib.rs

Raw
#![forbid(unsafe_code)]
#![warn(missing_docs)]

//! Shared runtime assembly for every interface mode.
//!
//! One runtime shape serves eval and RPC: resolve an endpoint from the
//! catalog, validate credentials without dispatch, and drive the
//! provider-independent agent. `mock` provides a scripted provider for
//! offline runs and tests.

pub mod http;
pub mod runtime;
pub mod wasm;

pub use runtime::{RuntimeConfig, RuntimeProvider, build_agent};
pub use smith_ai::auth::{AuthStore, credential_env_var};
pub use smith_ai::models::ProviderKind;

use smith::id::MessageId;
use smith::provider::{ProviderStream, StreamFn};
use smith::stream::StreamEvent;
use std::sync::Arc;
use std::sync::atomic::{AtomicUsize, Ordering};

/// A scripted mock provider: one canned response per request, then a final
/// apologetic refusal.
#[must_use]
pub fn mock_stream(script: Vec<Vec<StreamEvent>>) -> StreamFn {
    let script: Arc<[Vec<StreamEvent>]> = script.into();
    let next = AtomicUsize::new(0);
    Arc::new(move |_request, _cancel| {
        let index = next.fetch_add(1, Ordering::Relaxed);
        let response = script.get(index).cloned().unwrap_or_default();
        let stream: ProviderStream = Box::pin(futures::stream::iter(response.into_iter().map(Ok)));
        stream
    })
}

/// Convenience: a mock reply of plain text.
#[must_use]
pub fn mock_text_reply(text: &str) -> Vec<StreamEvent> {
    vec![
        StreamEvent::text_delta(MessageId::new(), text),
        StreamEvent::stop(smith::stream::StopReason::EndTurn, None),
    ]
}