MCPcopy Create free account
hub / github.com/ChrisFeldmeier/OpenCodeRust / chat_stream

Method chat_stream

crates/opencode-provider/src/cerebras.rs:112–177  ·  view source on GitHub ↗
(&self, request: ChatRequest)

Source from the content-addressed store, hash-verified

110 }
111
112 async fn chat_stream(&self, request: ChatRequest) -> Result<StreamResult, ProviderError> {
113 let url = CEREBRAS_API_URL;
114
115 let mut body = serde_json::json!({
116 "model": request.model,
117 "messages": request.messages,
118 "stream": true,
119 });
120
121 if let Some(temp) = request.temperature {
122 body["temperature"] = serde_json::json!(temp);
123 }
124 if let Some(max_tokens) = request.max_tokens {
125 body["max_tokens"] = serde_json::json!(max_tokens);
126 }
127 if let Some(tools) = &request.tools {
128 if !tools.is_empty() {
129 body["tools"] = serde_json::json!(tools);
130 }
131 }
132
133 let response = self
134 .client
135 .post(url)
136 .header("Authorization", format!("Bearer {}", self.api_key))
137 .header("Content-Type", "application/json")
138 .json(&body)
139 .send()
140 .await
141 .map_err(|e| ProviderError::NetworkError(e.to_string()))?;
142
143 if !response.status().is_success() {
144 let error_text = response.text().await.unwrap_or_default();
145 return Err(ProviderError::ApiError(error_text));
146 }
147
148 let stream = response
149 .bytes_stream()
150 .then(|result| async move {
151 match result {
152 Ok(bytes) => {
153 let text = String::from_utf8_lossy(&bytes);
154 let mut events: Vec<Result<StreamEvent, ProviderError>> = Vec::new();
155
156 for line in text.lines() {
157 if let Some(data) = line.strip_prefix("data: ") {
158 if data == "[DONE]" {
159 events.push(Ok(StreamEvent::Done));
160 continue;
161 }
162
163 if let Some(event) = crate::stream::parse_openai_sse(data) {
164 events.push(Ok(event));
165 }
166 }
167 }
168
169 events

Callers

nothing calls this directly

Calls 7

newFunction · 0.85
parse_openai_sseFunction · 0.85
is_emptyMethod · 0.80
ApiErrorEnum · 0.50
sendMethod · 0.45
statusMethod · 0.45
textMethod · 0.45

Tested by

no test coverage detected