You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
137 lines
3.5 KiB
Go
137 lines
3.5 KiB
Go
/*
|
|
* Copyright 2025 CloudWeGo Authors
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package prints
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"io"
|
|
"log"
|
|
"strings"
|
|
|
|
"github.com/cloudwego/eino/adk"
|
|
"github.com/cloudwego/eino/schema"
|
|
|
|
"github.com/cloudwego/eino-examples/internal/logs"
|
|
)
|
|
|
|
func Event(event *adk.AgentEvent) {
|
|
fmt.Printf("name: %s\npath: %s", event.AgentName, event.RunPath)
|
|
if event.Output != nil && event.Output.MessageOutput != nil {
|
|
if m := event.Output.MessageOutput.Message; m != nil {
|
|
if len(m.Content) > 0 {
|
|
if m.Role == schema.Tool {
|
|
fmt.Printf("\ntool response: %s", m.Content)
|
|
} else {
|
|
fmt.Printf("\nanswer: %s", m.Content)
|
|
}
|
|
}
|
|
if len(m.ToolCalls) > 0 {
|
|
for _, tc := range m.ToolCalls {
|
|
fmt.Printf("\ntool name: %s", tc.Function.Name)
|
|
fmt.Printf("\narguments: %s", tc.Function.Arguments)
|
|
}
|
|
}
|
|
} else if s := event.Output.MessageOutput.MessageStream; s != nil {
|
|
toolMap := map[int][]*schema.Message{}
|
|
var contentStart bool
|
|
charNumOfOneRow := 0
|
|
maxCharNumOfOneRow := 120
|
|
for {
|
|
chunk, err := s.Recv()
|
|
if err != nil {
|
|
if err == io.EOF {
|
|
break
|
|
}
|
|
fmt.Printf("error: %v", err)
|
|
return
|
|
}
|
|
if chunk.Content != "" {
|
|
if !contentStart {
|
|
contentStart = true
|
|
if chunk.Role == schema.Tool {
|
|
fmt.Printf("\ntool response: ")
|
|
} else {
|
|
fmt.Printf("\nanswer: ")
|
|
}
|
|
}
|
|
|
|
charNumOfOneRow += len(chunk.Content)
|
|
if strings.Contains(chunk.Content, "\n") {
|
|
charNumOfOneRow = 0
|
|
} else if charNumOfOneRow >= maxCharNumOfOneRow {
|
|
fmt.Printf("\n")
|
|
charNumOfOneRow = 0
|
|
}
|
|
fmt.Printf("%v", chunk.Content)
|
|
}
|
|
|
|
if len(chunk.ToolCalls) > 0 {
|
|
for _, tc := range chunk.ToolCalls {
|
|
index := tc.Index
|
|
if index == nil {
|
|
logs.Fatalf("index is nil")
|
|
}
|
|
toolMap[*index] = append(toolMap[*index], &schema.Message{
|
|
Role: chunk.Role,
|
|
ToolCalls: []schema.ToolCall{
|
|
{
|
|
ID: tc.ID,
|
|
Type: tc.Type,
|
|
Index: tc.Index,
|
|
Function: schema.FunctionCall{
|
|
Name: tc.Function.Name,
|
|
Arguments: tc.Function.Arguments,
|
|
},
|
|
},
|
|
},
|
|
})
|
|
}
|
|
}
|
|
}
|
|
|
|
for _, msgs := range toolMap {
|
|
m, err := schema.ConcatMessages(msgs)
|
|
if err != nil {
|
|
log.Fatalf("ConcatMessage failed: %v", err)
|
|
return
|
|
}
|
|
fmt.Printf("\ntool name: %s", m.ToolCalls[0].Function.Name)
|
|
fmt.Printf("\narguments: %s", m.ToolCalls[0].Function.Arguments)
|
|
}
|
|
}
|
|
}
|
|
if event.Action != nil {
|
|
if event.Action.TransferToAgent != nil {
|
|
fmt.Printf("\naction: transfer to %v", event.Action.TransferToAgent.DestAgentName)
|
|
}
|
|
if event.Action.Interrupted != nil {
|
|
ii, _ := json.MarshalIndent(event.Action.Interrupted.Data, " ", " ")
|
|
fmt.Printf("\naction: interrupted")
|
|
fmt.Printf("\ninterrupt snapshot: %v", string(ii))
|
|
}
|
|
if event.Action.Exit {
|
|
fmt.Printf("\naction: exit")
|
|
}
|
|
}
|
|
if event.Err != nil {
|
|
fmt.Printf("\nerror: %v", event.Err)
|
|
}
|
|
fmt.Println()
|
|
fmt.Println()
|
|
}
|