Skip to main content

zerolaunch_plugin_api/services/model/
provider.rs

1//! 模型提供方接口:内置后端(OpenAI 兼容 / Ollama)与第三方插件后端实现同一接口。
2
3use async_trait::async_trait;
4use tokio::sync::mpsc;
5
6use super::types::{
7    ModelChatRequest, ModelChatResponse, ModelEmbeddingRequest, ModelEmbeddingResponse, ModelError,
8    ModelInfo, ModelStreamChunk,
9};
10
11/// 模型提供方:声明模型清单并提供模型调用能力。
12///
13/// 宿主内置提供方(OpenAI 兼容 / Ollama)与第三方插件后端(插件注册为
14/// Provider 组件)均实现本接口;宿主 `ModelRegistry` 聚合清单并按
15/// `provider_id` 前缀路由调用。提供方只实现自己支持的模型种类,
16/// 不支持的调用返回 `ModelError::NotSupported`。
17#[async_trait]
18pub trait ModelProvider: Send + Sync {
19    /// 提供方标识(如 "openai"、"ollama"、插件 id)。
20    /// 与 model_id 的 `{provider}/` 前缀一致,宿主按此前缀路由。
21    fn provider_id(&self) -> String;
22    /// 返回影响 embedding 结果的 provider 配置命名空间,供宿主缓存隔离。
23    /// 默认使用 provider_id;配置化 provider 应覆盖并包含 endpoint/模型配置版本。
24    fn cache_namespace(&self) -> String {
25        self.provider_id()
26    }
27
28    /// 当前支持的模型清单(可能随环境/配置变化)。
29    async fn list_models(&self) -> Result<Vec<ModelInfo>, ModelError>;
30
31    /// 调用文本生成模型;仅支持 chat 模型的提供方实现。
32    async fn chat(&self, req: ModelChatRequest) -> Result<ModelChatResponse, ModelError>;
33
34    /// 调用流式文本生成模型:增量经 tx 推送,完成后关闭通道。
35    async fn stream_chat(
36        &self,
37        req: ModelChatRequest,
38        tx: mpsc::Sender<ModelStreamChunk>,
39    ) -> Result<(), ModelError>;
40
41    /// 调用文本向量化模型;仅支持 embedding 模型的提供方实现(task_type 必填)。
42    async fn embedding(
43        &self,
44        req: ModelEmbeddingRequest,
45    ) -> Result<ModelEmbeddingResponse, ModelError>;
46
47    /// 提供方可用性探测(如 Ollama 未启动);默认恒可用。
48    async fn is_available(&self) -> bool {
49        true
50    }
51}