40 lines
1.2 KiB
Rust
40 lines
1.2 KiB
Rust
//! 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<Pin<Box<dyn Stream<Item = Result<Event, ClientError>> + Send>>, ClientError>;
|
|
}
|
|
|
|
/// `Box<dyn LlmClient>` に対する `LlmClient` の実装
|
|
///
|
|
/// これにより、動的ディスパッチを使用するクライアントも `Worker` で利用可能になる。
|
|
#[async_trait]
|
|
impl LlmClient for Box<dyn LlmClient> {
|
|
async fn stream(
|
|
&self,
|
|
request: Request,
|
|
) -> Result<Pin<Box<dyn Stream<Item = Result<Event, ClientError>> + Send>>, ClientError> {
|
|
(**self).stream(request).await
|
|
}
|
|
}
|