gestura_core/
streaming.rs

1//! Streaming LLM provider support for Gestura.
2//!
3//! Domain types and provider configs are defined in `gestura-core-streaming` and
4//! re-exported here.  This module adds the core-owned [`streaming_config_from`]
5//! function which bridges [`crate::config::AppConfig`] to a
6//! [`StreamingConfig`].
7
8pub use gestura_core_streaming::streaming::*;
9pub use gestura_core_streaming::{
10    AnthropicProviderConfig, GeminiProviderConfig, GrokProviderConfig, OllamaProviderConfig,
11    OpenAiProviderConfig, StreamingConfig,
12};
13
14use crate::config::AppConfig;
15
16/// Convert an `AppConfig` reference to a `StreamingConfig`.
17///
18/// This is a free function because the orphan rule prevents `impl From<&AppConfig> for StreamingConfig`
19/// when both types are defined in foreign crates.
20pub fn streaming_config_from(app: &AppConfig) -> StreamingConfig {
21    StreamingConfig {
22        primary: app.llm.primary.clone(),
23        fallback: app.llm.fallback.clone(),
24        openai: app.llm.openai.as_ref().map(|c| OpenAiProviderConfig {
25            api_key: c.api_key.clone(),
26            base_url: c.base_url.clone(),
27            model: c.model.clone(),
28        }),
29        anthropic: app.llm.anthropic.as_ref().map(|c| AnthropicProviderConfig {
30            api_key: c.api_key.clone(),
31            base_url: c.base_url.clone(),
32            model: c.model.clone(),
33            thinking_budget_tokens: c.thinking_budget_tokens,
34        }),
35        gemini: app.llm.gemini.as_ref().map(|c| GeminiProviderConfig {
36            api_key: c.api_key.clone(),
37            base_url: c.base_url.clone(),
38            model: c.model.clone(),
39        }),
40        grok: app.llm.grok.as_ref().map(|c| GrokProviderConfig {
41            api_key: c.api_key.clone(),
42            base_url: c.base_url.clone(),
43            model: c.model.clone(),
44        }),
45        ollama: app.llm.ollama.as_ref().map(|c| OllamaProviderConfig {
46            base_url: c.base_url.clone(),
47            model: c.model.clone(),
48        }),
49    }
50}