use foundation_db::traits::DocumentStore;
use crate::agentic::{AgentSessionBuilder, MemoryStore};
#[cfg(feature = "candle")]
use crate::backends::candle::CandleArchitecture;
#[cfg(feature = "candle")]
use crate::backends::huggingface_candle_provider::{
HuggingFaceCandleConfig, HuggingFaceCandleProvider,
};
use crate::backends::huggingface_gguf_provider::HuggingFaceGGUFConfig;
use crate::types::{ModelId, SessionId};
use super::providers::{
CloudPresets, Gemma4E2b, Gemma4_26b, Glm52, Qwen36, CLAUDE_OPUS, CLAUDE_SONNET, OPENAI_GPT4O,
OPENAI_GPT4O_MINI,
};
use super::router::{RouterMix, RouterPreset};
fn named(id: &str) -> ModelId {
ModelId::Name(id.to_string(), None)
}
pub fn glm52_gemma_router(
main: Option<HuggingFaceGGUFConfig>,
memory: Option<HuggingFaceGGUFConfig>,
) -> Result<RouterPreset, String> {
let main_provider = Glm52::q4_k_m(main)?;
let memory_provider = Gemma4E2b::q4_k_m(memory)?;
Ok(RouterMix::new()
.primary(main_provider, named(Glm52::MODEL_ID))
.memory(memory_provider, named(Gemma4E2b::MODEL_ID))
.build())
}
pub fn glm52_gemma_session<D, M>(
session_id: SessionId,
main: Option<HuggingFaceGGUFConfig>,
memory: Option<HuggingFaceGGUFConfig>,
) -> Result<AgentSessionBuilder<D, M>, String>
where
D: DocumentStore + 'static,
M: MemoryStore + 'static,
{
Ok(glm52_gemma_router(main, memory)?.into_agent_builder(session_id))
}
pub fn qwen36_gemma_router(
main: Option<HuggingFaceGGUFConfig>,
memory: Option<HuggingFaceGGUFConfig>,
) -> Result<RouterPreset, String> {
let main_provider = Qwen36::q4_k_m(main)?;
let memory_provider = Gemma4E2b::q4_k_m(memory)?;
Ok(RouterMix::new()
.primary(main_provider, named(Qwen36::MODEL_ID))
.memory(memory_provider, named(Gemma4E2b::MODEL_ID))
.build())
}
pub fn qwen36_gemma_session<D, M>(
session_id: SessionId,
main: Option<HuggingFaceGGUFConfig>,
memory: Option<HuggingFaceGGUFConfig>,
) -> Result<AgentSessionBuilder<D, M>, String>
where
D: DocumentStore + 'static,
M: MemoryStore + 'static,
{
Ok(qwen36_gemma_router(main, memory)?.into_agent_builder(session_id))
}
pub fn gemma_router(
main: Option<HuggingFaceGGUFConfig>,
memory: Option<HuggingFaceGGUFConfig>,
) -> Result<RouterPreset, String> {
let main_provider = Gemma4_26b::q4_k_m(main)?;
let memory_provider = Gemma4E2b::q4_k_m(memory)?;
Ok(RouterMix::new()
.primary(main_provider, named(Gemma4_26b::MODEL_ID))
.memory(memory_provider, named(Gemma4E2b::MODEL_ID))
.build())
}
pub fn gemma_session<D, M>(
session_id: SessionId,
main: Option<HuggingFaceGGUFConfig>,
memory: Option<HuggingFaceGGUFConfig>,
) -> Result<AgentSessionBuilder<D, M>, String>
where
D: DocumentStore + 'static,
M: MemoryStore + 'static,
{
Ok(gemma_router(main, memory)?.into_agent_builder(session_id))
}
pub fn claude_router(api_key: &str) -> Result<RouterPreset, String> {
let main_provider = CloudPresets::claude_opus(api_key)?;
let memory_provider = CloudPresets::claude_sonnet(api_key)?;
Ok(RouterMix::new()
.primary(main_provider, named(CLAUDE_OPUS))
.memory(memory_provider, named(CLAUDE_SONNET))
.build())
}
pub fn claude_session<D, M>(
session_id: SessionId,
api_key: &str,
) -> Result<AgentSessionBuilder<D, M>, String>
where
D: DocumentStore + 'static,
M: MemoryStore + 'static,
{
Ok(claude_router(api_key)?.into_agent_builder(session_id))
}
pub fn openai_chat_router(api_key: &str) -> Result<RouterPreset, String> {
let main_provider = CloudPresets::openai_gpt4o(api_key)?;
let memory_provider = CloudPresets::openai_gpt4o(api_key)?;
Ok(RouterMix::new()
.primary(main_provider, named(OPENAI_GPT4O))
.memory(memory_provider, named(OPENAI_GPT4O_MINI))
.build())
}
pub fn openai_chat_session<D, M>(
session_id: SessionId,
api_key: &str,
) -> Result<AgentSessionBuilder<D, M>, String>
where
D: DocumentStore + 'static,
M: MemoryStore + 'static,
{
Ok(openai_chat_router(api_key)?.into_agent_builder(session_id))
}
pub fn openai_responses_router(api_key: &str) -> Result<RouterPreset, String> {
let main_provider = CloudPresets::openai_responses(api_key)?;
let memory_provider = CloudPresets::openai_responses(api_key)?;
Ok(RouterMix::new()
.primary(main_provider, named(OPENAI_GPT4O))
.memory(memory_provider, named(OPENAI_GPT4O_MINI))
.build())
}
pub fn openai_responses_session<D, M>(
session_id: SessionId,
api_key: &str,
) -> Result<AgentSessionBuilder<D, M>, String>
where
D: DocumentStore + 'static,
M: MemoryStore + 'static,
{
Ok(openai_responses_router(api_key)?.into_agent_builder(session_id))
}
#[cfg(feature = "candle")]
pub fn candle_llama_router(
repo_id: &str,
config: Option<HuggingFaceCandleConfig>,
) -> Result<RouterPreset, String> {
let config = config.unwrap_or_else(|| {
HuggingFaceCandleConfig::builder()
.architecture(CandleArchitecture::Llama)
.build()
});
let provider = HuggingFaceCandleProvider::new(config)
.map_err(|e| format!("Failed to create Candle provider: {e}"))?;
Ok(RouterMix::new()
.primary(provider, named(repo_id))
.build())
}
#[cfg(feature = "candle")]
pub fn candle_llama_session<D, M>(
session_id: SessionId,
repo_id: &str,
config: Option<HuggingFaceCandleConfig>,
) -> Result<AgentSessionBuilder<D, M>, String>
where
D: DocumentStore + 'static,
M: MemoryStore + 'static,
{
Ok(candle_llama_router(repo_id, config)?.into_agent_builder(session_id))
}