feat(backend): modèle unifié streaming/progress/events provider-agnostic + pont app-tauri — foundation #156 (QA verte)
This commit is contained in:
@ -15,7 +15,8 @@ use serde::{Deserialize, Serialize};
|
||||
use serde_json::{json, Value};
|
||||
|
||||
use domain::ports::{
|
||||
AgentSession, AgentSessionError, ReplyEvent, ReplyStream, ToolInvoker, ToolSpec,
|
||||
AgentSession, AgentSessionError, ReplyEvent, ReplyProgress, ReplyProgressKind,
|
||||
ReplyProgressSource, ReplyProgressStage, ReplyStream, ToolInvoker, ToolSpec,
|
||||
};
|
||||
use domain::profile::{HttpChatConfig, StructuredAdapter};
|
||||
use domain::SessionId;
|
||||
@ -461,6 +462,13 @@ impl OpenAiCompatibleSession {
|
||||
}));
|
||||
|
||||
for call in tool_calls {
|
||||
let started = local_tool_progress(
|
||||
ReplyProgressStage::Started,
|
||||
format!("appel MCP {}", call.name),
|
||||
&call.name,
|
||||
);
|
||||
send_tap(tap, &started);
|
||||
events.push(started);
|
||||
let event = ReplyEvent::ToolActivity {
|
||||
label: call.name.clone(),
|
||||
};
|
||||
@ -473,6 +481,13 @@ impl OpenAiCompatibleSession {
|
||||
.unwrap_or_else(|e| format!("Tool invocation failed: {e}")),
|
||||
None => "Tool invocation unavailable".to_owned(),
|
||||
};
|
||||
let completed = local_tool_progress(
|
||||
ReplyProgressStage::Completed,
|
||||
format!("MCP {} terminé", call.name),
|
||||
&call.name,
|
||||
);
|
||||
send_tap(tap, &completed);
|
||||
events.push(completed);
|
||||
self.transcript.lock().expect("mutex sain").push(json!({
|
||||
"role": "tool",
|
||||
"tool_call_id": call.id,
|
||||
@ -639,6 +654,22 @@ fn send_tap(tap: &Option<std::sync::mpsc::Sender<ReplyEvent>>, event: &ReplyEven
|
||||
}
|
||||
}
|
||||
|
||||
fn local_tool_progress(
|
||||
stage: ReplyProgressStage,
|
||||
label: impl Into<String>,
|
||||
tool_name: &str,
|
||||
) -> ReplyEvent {
|
||||
ReplyEvent::Progress {
|
||||
progress: ReplyProgress::new(
|
||||
ReplyProgressSource::IdeaLocal,
|
||||
ReplyProgressKind::Mcp,
|
||||
stage,
|
||||
label,
|
||||
)
|
||||
.with_tool_name(tool_name.to_owned()),
|
||||
}
|
||||
}
|
||||
|
||||
fn should_retry_without_tools(err: &AgentSessionError, using_tools: bool) -> bool {
|
||||
using_tools && matches!(err, AgentSessionError::Start(_))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user