ooodc fc7df67474 feat(streaming): 支持流式文本增量与结束信号功能
- 新增 StreamDelta 和 StreamEnd 类型,支持流式数据增量传输
- 扩展 LLMProvider trait,添加带回调的 chat_with_streaming 接口
- 修改 OpenAI Provider 实现,支持流式聊天回调传输增量数据
- Agent 流处理改为异步消费增量消息并传递给前端
- 保证流式增量和最终消息使用相同消息 ID 以便前端替换
- 修改消息总线和协议层,支持携带和识别流式消息的消息 ID
- 客户端 CLI 通过增量输出实现交互式流式响应显示
- Web 前端接收流式增量消息,追加到对应消息,实现实时显示
- 各通道(飞书、微信)支持转发流式增量和结束消息
- 任务工具运行时添加消息 ID 支持,保持消息一致性
- 统一消息构造函数新增流式增量和结束信号的构建方法
2026-06-14 10:24:52 +08:00

59 lines
1.7 KiB
Rust

pub mod anthropic;
pub mod openai;
pub mod traits;
pub use self::anthropic::AnthropicProvider;
pub use self::openai::OpenAIProvider;
pub use crate::domain::messages::ToolCall;
pub use crate::domain::tools::{Tool, ToolFunction};
pub use traits::{
ChatCompletionRequest, ChatCompletionResponse, LLMProvider, Message, ProviderRuntimeConfig,
StreamCallback, StreamDelta, Usage,
};
pub fn create_provider(
config: ProviderRuntimeConfig,
) -> Result<Box<dyn LLMProvider>, ProviderError> {
match config.provider_type.as_str() {
"openai" => Ok(Box::new(OpenAIProvider::new(
config.name,
config.api_key,
config.base_url,
config.extra_headers,
config.llm_timeout_secs,
config.model_id,
config.temperature,
config.max_tokens,
config.model_extra,
))),
"anthropic" => Ok(Box::new(AnthropicProvider::new(
config.name,
config.api_key,
config.base_url,
config.extra_headers,
config.llm_timeout_secs,
config.model_id,
config.temperature,
config.max_tokens,
config.model_extra,
))),
_ => Err(ProviderError::UnknownProviderType(config.provider_type)),
}
}
#[derive(Debug)]
pub enum ProviderError {
UnknownProviderType(String),
}
impl std::fmt::Display for ProviderError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ProviderError::UnknownProviderType(t) => write!(f, "Unknown provider type: {}", t),
}
}
}
impl std::error::Error for ProviderError {}