Skip to main content

claude_rust_types/domain/
provider.rs

1use claude_rust_errors::AppResult;
2use futures::stream::BoxStream;
3use serde_json::Value;
4
5use super::message::Conversation;
6
7#[derive(Debug, Clone)]
8pub enum StopReason {
9    EndTurn,
10    ToolUse,
11    MaxTokens,
12}
13
14#[derive(Debug, Clone)]
15pub struct UsageStats {
16    pub input_tokens: u64,
17    pub output_tokens: u64,
18}
19
20#[derive(Debug, Clone)]
21pub enum StreamEvent {
22    ContentDelta { text: String },
23    ThinkingDelta { text: String },
24    ToolUseStart { id: String, name: String },
25    ToolUseDelta { json_chunk: String },
26    Stop { reason: StopReason },
27    Usage { stats: UsageStats },
28    Error { message: String },
29}
30
31#[async_trait::async_trait]
32pub trait Provider: Send + Sync {
33    async fn stream(
34        &self,
35        conversation: &Conversation,
36        tools: &[Value],
37    ) -> AppResult<BoxStream<'static, StreamEvent>>;
38}