1use crate::proxy::{LlmProvider, LlmRequest, LlmResponse};
6use anyhow::Result;
7use async_trait::async_trait;
8
9#[cfg(feature = "candle")]
10use crate::proxy::LlmUsage;
11#[cfg(feature = "candle")]
12use candle_core::{Device, Tensor};
13#[cfg(feature = "candle")]
14use candle_transformers::models::llama;
15
16pub struct CandleProvider {
17 model_path: Option<String>,
19}
20
21impl CandleProvider {
22 pub fn new(model_path: Option<String>) -> Self {
23 Self { model_path }
24 }
25}
26
27impl Default for CandleProvider {
28 fn default() -> Self {
29 Self::new(None)
30 }
31}
32
33#[async_trait]
34impl LlmProvider for CandleProvider {
35 async fn complete(&self, _request: LlmRequest) -> Result<LlmResponse> {
36 #[cfg(not(feature = "candle"))]
37 {
38 return Err(anyhow::anyhow!(
39 "Candle support is not enabled. Recompile with --features candle"
40 ));
41 }
42
43 #[cfg(feature = "candle")]
44 {
45 let _suppress_warnings = (
47 std::marker::PhantomData::<LlmUsage>,
48 std::marker::PhantomData::<Device>,
49 std::marker::PhantomData::<Tensor>,
50 std::marker::PhantomData::<llama::Config>,
51 );
52
53 println!(
61 "🕯️ Running local inference with Candle (model: {})...",
62 _request.model
63 );
64
65 Ok(LlmResponse {
67 content: format!("Local inference with Candle is configured but requires model weights. (Requested model: {})", _request.model),
68 model: _request.model,
69 usage: None,
70 })
71 }
72 }
73
74 fn name(&self) -> &'static str {
75 "Candle"
76 }
77}