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),
]
}