imp_llm/stream.rs
1use serde::{Deserialize, Serialize};
2
3use crate::message::AssistantMessage;
4
5/// Normalized stream events produced by all providers.
6#[derive(Debug, Clone, Serialize, Deserialize)]
7#[serde(tag = "type")]
8pub enum StreamEvent {
9 /// New message starting.
10 MessageStart { model: String },
11
12 /// Incremental text from the assistant.
13 TextDelta { text: String },
14
15 /// Incremental thinking/reasoning output.
16 ThinkingDelta { text: String },
17
18 /// A complete tool call (accumulated from deltas).
19 ToolCall {
20 id: String,
21 name: String,
22 arguments: serde_json::Value,
23 },
24
25 /// Message complete with final message.
26 MessageEnd { message: AssistantMessage },
27
28 /// Unrecoverable stream error.
29 Error { error: String },
30}
31
32/// Structured error returned by a provider's API.
33#[derive(Debug, Clone, Serialize, Deserialize)]
34pub struct ProviderError {
35 /// Machine-readable error code (e.g. "rate_limit_exceeded").
36 pub code: String,
37 /// Human-readable error description.
38 pub message: String,
39 /// Whether the caller should retry the request.
40 pub retryable: bool,
41}