//! LLMクライアント共通trait定義 use std::pin::Pin; use crate::llm_client::{ClientError, Request, event::Event}; use async_trait::async_trait; use futures::Stream; /// LLMクライアントのtrait /// /// 各プロバイダはこのtraitを実装し、統一されたインターフェースを提供する。 #[async_trait] pub trait LlmClient: Send + Sync { /// ストリーミングリクエストを送信し、Eventストリームを返す /// /// # Arguments /// * `request` - リクエスト情報 /// /// # Returns /// * `Ok(Stream)` - イベントストリーム /// * `Err(ClientError)` - エラー async fn stream( &self, request: Request, ) -> Result> + Send>>, ClientError>; } /// `Box` に対する `LlmClient` の実装 /// /// これにより、動的ディスパッチを使用するクライアントも `Worker` で利用可能になる。 #[async_trait] impl LlmClient for Box { async fn stream( &self, request: Request, ) -> Result> + Send>>, ClientError> { (**self).stream(request).await } }