mirror of
https://github.com/Ed1s0nZ/CyberStrikeAI.git
synced 2026-08-15 07:30:53 +02:00
86 lines
2.4 KiB
Go
86 lines
2.4 KiB
Go
package multiagent
|
|
|
|
import "cyberstrike-ai/internal/openai"
|
|
|
|
type einoMainResponseStreamEmitter struct {
|
|
progress func(eventType, message string, data interface{})
|
|
snapshotMCPIDs func() []string
|
|
conversationID string
|
|
orchMode string
|
|
agentName string
|
|
streamID string
|
|
iteration int
|
|
headerSent bool
|
|
wireAccum string
|
|
}
|
|
|
|
func newEinoMainResponseStreamEmitter(
|
|
conversationID, orchMode, agentName, streamID string,
|
|
iteration int,
|
|
progress func(eventType, message string, data interface{}),
|
|
snapshotMCPIDs func() []string,
|
|
) *einoMainResponseStreamEmitter {
|
|
if snapshotMCPIDs == nil {
|
|
snapshotMCPIDs = func() []string { return nil }
|
|
}
|
|
return &einoMainResponseStreamEmitter{
|
|
progress: progress,
|
|
snapshotMCPIDs: snapshotMCPIDs,
|
|
conversationID: conversationID,
|
|
orchMode: orchMode,
|
|
agentName: agentName,
|
|
streamID: streamID,
|
|
iteration: iteration,
|
|
}
|
|
}
|
|
|
|
func (e *einoMainResponseStreamEmitter) EmitDelta(delta, accumulated string) bool {
|
|
if e == nil || e.progress == nil || delta == "" {
|
|
return false
|
|
}
|
|
e.emitStart()
|
|
e.progress("response_delta", delta, openai.WithSSEAccumulated(e.responseData(), accumulated))
|
|
e.wireAccum, _ = normalizeStreamingDelta(e.wireAccum, delta)
|
|
return true
|
|
}
|
|
|
|
func (e *einoMainResponseStreamEmitter) EmitTailFromFull(full string) bool {
|
|
if e == nil || full == "" {
|
|
return false
|
|
}
|
|
_, tail := normalizeStreamingDelta(e.wireAccum, full)
|
|
if tail == "" {
|
|
return false
|
|
}
|
|
return e.EmitDelta(tail, full)
|
|
}
|
|
|
|
func (e *einoMainResponseStreamEmitter) emitStart() {
|
|
if e.headerSent || e.progress == nil {
|
|
return
|
|
}
|
|
e.progress("response_start", "", map[string]interface{}{
|
|
"conversationId": e.conversationID,
|
|
"mcpExecutionIds": e.snapshotMCPIDs(),
|
|
"messageGeneratedBy": "eino:" + e.agentName,
|
|
"einoRole": "orchestrator",
|
|
"einoAgent": e.agentName,
|
|
"orchestration": e.orchMode,
|
|
"iteration": e.iteration,
|
|
"streamId": e.streamID,
|
|
})
|
|
e.headerSent = true
|
|
}
|
|
|
|
func (e *einoMainResponseStreamEmitter) responseData() map[string]interface{} {
|
|
return map[string]interface{}{
|
|
"conversationId": e.conversationID,
|
|
"mcpExecutionIds": e.snapshotMCPIDs(),
|
|
"einoRole": "orchestrator",
|
|
"einoAgent": e.agentName,
|
|
"orchestration": e.orchMode,
|
|
"iteration": e.iteration,
|
|
"streamId": e.streamID,
|
|
}
|
|
}
|