MCPcopy Index your code
hub / github.com/ChrisFeldmeier/OpenCodeRust / chat_stream

Method chat_stream

crates/opencode-provider/src/openrouter.rs:203–248  ·  view source on GitHub ↗
(&self, request: ChatRequest)

Source from the content-addressed store, hash-verified

201 }
202
203 async fn chat_stream(&self, request: ChatRequest) -> Result<StreamResult, ProviderError> {
204 let url = self
205 .config
206 .base_url
207 .as_deref()
208 .unwrap_or(OPENROUTER_API_URL);
209
210 let mut stream_request = request;
211 stream_request.stream = Some(true);
212
213 let response = self
214 .client
215 .post(url)
216 .headers(self.build_headers())
217 .header("Accept", "text/event-stream")
218 .json(&stream_request)
219 .send()
220 .await
221 .map_err(|e| ProviderError::NetworkError(e.to_string()))?;
222
223 if !response.status().is_success() {
224 let status = response.status();
225 let body = response.text().await.unwrap_or_default();
226 return Err(ProviderError::ApiError(format!("{}: {}", status, body)));
227 }
228
229 let stream = response
230 .bytes_stream()
231 .map(move |chunk_result| match chunk_result {
232 Ok(bytes) => {
233 let text = String::from_utf8_lossy(&bytes);
234 for line in text.lines() {
235 if line.starts_with("data: ") {
236 let data = &line[6..];
237 if let Some(event) = crate::stream::parse_openai_sse(data) {
238 return Ok(event);
239 }
240 }
241 }
242 Ok(StreamEvent::TextDelta(String::new()))
243 }
244 Err(e) => Err(ProviderError::StreamError(e.to_string())),
245 });
246
247 Ok(Box::pin(stream))
248 }
249}

Callers

nothing calls this directly

Calls 7

parse_openai_sseFunction · 0.85
newFunction · 0.85
ApiErrorEnum · 0.50
sendMethod · 0.45
build_headersMethod · 0.45
statusMethod · 0.45
textMethod · 0.45

Tested by

no test coverage detected