Skip to content

v0.10.0

Choose a tag to compare

@github-actions github-actions released this 15 May 00:28
· 47 commits to main since this release

Added — STT harness: agentic streaming speech-to-text pipeline

A new capability layer that diarizes, transcribes, and accumulates a
conversation record aligned to agentic structures. See
docs/stt-harness.md.

  • crates/stt-harness — the harness core: audio sources (mic /
    file / bytes), a streaming session actor, diarization + voice-mode
    coalescing, the loop/termination strategies, and a ConversationStore
    with a Checkpointer-backed implementation (state feature).
    BoxedSttHarness mirrors the Agent/Harness boxed-handle pattern.
  • crates/stt-harness-web — an optional axum backend plus an
    embedded React SPA (embed-ui feature, via rust-embed) for
    reviewing and editing diarized conversations: REST routes, a
    WebSocket live feed, and the SPA fallback handler.
  • atomr-agents serve now runs the real review UI when the CLI is
    built with --features stt-web, persisting conversations through the
    configured crates/state checkpointer.
  • xtask stt-web-build — builds the React SPA into ui/dist so
    stt-harness-web can be compiled with --features embed-ui.
  • Python bindingsatomr_agents.stt_harness wraps the harness;
    the top-level facade now resolves native names defensively so a name
    not yet bound on the Rust side degrades to None instead of failing
    the whole package import.

Added — Phase C: async scorers, guest adapters, boxed Agent/Harness, Python workflow runner

Closes the "Phase B" deferral comments scattered across crates/agent,
crates/harness, crates/eval, and crates/py-bindings/src/{agent, harness,workflow,eval}.rs. The five blocks:

  • AsyncScorer trait (crates/eval/src/scorer.rs). Parallel to
    the existing sync Scorer; blanket impl<S: Scorer> AsyncScorer for S keeps existing sync impls compatible. LlmJudgeScorer,
    RubricScorer, and PairwiseScorer now implement AsyncScorer
    directly — dropping the tokio::task::block_in_place workaround
    the sync Scorer impl required. EvalSuite::scorer field type
    changed from Arc<dyn Scorer> to Arc<dyn AsyncScorer>.
  • 6 Python→Rust guest adapters (crates/py-bindings/src/guest/).
    The single-file guest.rs (331 LOC) is split into a guest/
    directory (10 files, ~1400 LOC). New adapters: PyInstructionAdapter,
    PyMemoryStrategyAdapter, PySkillStrategyAdapter, PyPersonaAdapter,
    PyMemoryStoreAdapter, PyEmbedderAdapter. Each ships a
    build_guest_* factory mirroring the existing build_guest_toolset
    pattern.
  • BoxedAgent + AgentSpec::into_agent (crates/agent/src/boxed.rs).
    Object-erased BoxedAgent for config-driven instantiation. The typed
    Agent<I,T,Ms,Sk> keeps hot-path monomorphization; both share a
    pub(crate) async fn run_turn_impl helper.
  • HarnessDispatch + HarnessRef + BoxedHarness (crates/harness/).
    Mirror of the Agent boxed-handle pattern. Harness::into_boxed,
    HarnessSpec::into_harness, and impl HarnessDispatch for Harness<L,T>
    added.
  • PyAgent, PyHarness, PyWorkflowRunner Python wrappers with
    from_spec / from_dict constructors and async run_turn / run
    exposed as Python coroutines via
    pyo3_async_runtimes::tokio::future_into_py. WorkflowRunner::new
    was added as a public constructor.

Changed

  • EvalSuite::scorer field type: Arc<dyn Scorer>
    Arc<dyn AsyncScorer>. The blanket impl<S: Scorer> AsyncScorer for S means callers holding a sync Arc::new(SomeSyncScorer)
    continue to compile via auto-unsizing into the new field type.
    Direct &dyn Scorer callers of LlmJudgeScorer / RubricScorer
    must migrate to &dyn AsyncScorer — Rust coherence forbids both
    the blanket AsyncScorer impl and a direct Scorer impl on the
    same judge (ContainsScorer is unaffected).
  • Sibling deps (atomr, atomr-infer, atomr-accel) consume
    crates.io artifacts only — no path = "../sibling/..." links.
    Pinned to atomr 0.9.2 / atomr-infer 0.8.0 / atomr-accel 0.10.0.