I wrote clark-agent, a small Rust library for running LLM tool loops.
The loop is:
context -> model -> tool call -> tool result -> repeat
The parts I wanted typed were:
- transcript messages - tool calls - tool results - stream events - tool schemas
The model/provider boundary is a StreamFn trait. Tools implement AgentTool. There are hooks for things like context transforms, tool gates, observers, and follow-up messages.