`src/api.rs` — the `ApiClient` trait
The border between loopctl and every model provider. Object-safe; two required methods; options methods that fail loudly by default.
Key items
ApiClient— required:model(),stream_messages(&StreamRequest),create_message(&StreamRequest). Provided:set_model(defaultfalse),base_url(default""),stream_messages_with_options/create_message_with_options(default: reject non-empty options),extract_structured(default: tool-call input, else lenient JSON from text).StreamRequest { messages, system, tools }+new/with_system/with_tools.NonStreamingResponse { message, stop_reason, usage }.- Type aliases
BoxedApiClient,SharedApiClient.
Behavior notes
- Streams must be
'static— clone out of&self, never borrow it. (create_messagefutures may borrow:+ '_.) - The fail-loud options defaults are deliberate: silently dropping a model override or a constraint would corrupt behavior invisibly.
base_url()keys the rate limiter — custom clients that don’t override it all share one bucket.
Deep dive: API client.