(
State(state): State<Arc<ServerState>>,
Path(session_id): Path<String>,
Json(req): Json<SendMessageRequest>,
)
| 1292 | } |
| 1293 | |
| 1294 | async fn stream_message( |
| 1295 | State(state): State<Arc<ServerState>>, |
| 1296 | Path(session_id): Path<String>, |
| 1297 | Json(req): Json<SendMessageRequest>, |
| 1298 | ) -> std::result::Result<Sse<impl Stream<Item = std::result::Result<Event, Infallible>>>, ApiError> |
| 1299 | { |
| 1300 | let config = CONFIG_STATE.read().await; |
| 1301 | let (provider, provider_id, model_id) = |
| 1302 | resolve_provider_and_model(&state, req.model.as_deref(), config.model.as_deref(), None)?; |
| 1303 | drop(config); |
| 1304 | |
| 1305 | let (history, msg_id, selected_variant) = { |
| 1306 | let mut sessions = state.sessions.lock().await; |
| 1307 | let session = sessions |
| 1308 | .get_mut(&session_id) |
| 1309 | .ok_or_else(|| ApiError::SessionNotFound(session_id.clone()))?; |
| 1310 | |
| 1311 | session.add_user_message(&req.content); |
| 1312 | let history = session.messages.clone(); |
| 1313 | let selected_variant = req.variant.clone().or_else(|| { |
| 1314 | session |
| 1315 | .metadata |
| 1316 | .get("model_variant") |
| 1317 | .and_then(|value| value.as_str()) |
| 1318 | .map(|value| value.to_string()) |
| 1319 | }); |
| 1320 | if let Some(variant) = req.variant.as_deref() { |
| 1321 | session |
| 1322 | .metadata |
| 1323 | .insert("model_variant".to_string(), serde_json::json!(variant)); |
| 1324 | } |
| 1325 | session.metadata.insert( |
| 1326 | "model_provider".to_string(), |
| 1327 | serde_json::json!(provider_id.clone()), |
| 1328 | ); |
| 1329 | session |
| 1330 | .metadata |
| 1331 | .insert("model_id".to_string(), serde_json::json!(model_id.clone())); |
| 1332 | |
| 1333 | let assistant_msg = session.add_assistant_message(); |
| 1334 | (history, assistant_msg.id.clone(), selected_variant) |
| 1335 | }; |
| 1336 | |
| 1337 | let provider_messages = session_messages_to_provider_messages(&history); |
| 1338 | let variant = selected_variant.clone(); |
| 1339 | let temperature = temperature_for_model(&model_id).or(Some(0.7)); |
| 1340 | let top_p = top_p_for_model(&model_id); |
| 1341 | let max_tokens = max_tokens_for_variant(4096, variant.as_deref()); |
| 1342 | let request = opencode_provider::ChatRequest { |
| 1343 | model: model_id.clone(), |
| 1344 | messages: provider_messages, |
| 1345 | max_tokens: Some(max_tokens), |
| 1346 | temperature, |
| 1347 | top_p, |
| 1348 | system: None, |
| 1349 | tools: None, |
| 1350 | stream: Some(true), |
| 1351 | variant, |
nothing calls this directly
no test coverage detected