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.
119 lines
2.4 KiB
Go
119 lines
2.4 KiB
Go
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"context"
|
|
"errors"
|
|
"flag"
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
"strings"
|
|
|
|
"github.com/cloudwego/eino/adk"
|
|
"github.com/cloudwego/eino/schema"
|
|
|
|
examplemodel "github.com/cloudwego/eino-examples/adk/common/model"
|
|
)
|
|
|
|
func main() {
|
|
var instruction string
|
|
flag.StringVar(&instruction, "instruction", "You are a helpful assistant.", "")
|
|
flag.Parse()
|
|
|
|
ctx := context.Background()
|
|
cm := examplemodel.NewChatModel()
|
|
|
|
agent, err := adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{
|
|
Name: "Ch02ChatModelAgent",
|
|
Description: "A minimal ChatModelAgent with in-memory multi-turn history.",
|
|
Instruction: instruction,
|
|
Model: cm,
|
|
})
|
|
if err != nil {
|
|
_, _ = fmt.Fprintln(os.Stderr, err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
runner := adk.NewRunner(ctx, adk.RunnerConfig{
|
|
Agent: agent,
|
|
EnableStreaming: true,
|
|
})
|
|
|
|
history := make([]*schema.Message, 0, 16)
|
|
scanner := bufio.NewScanner(os.Stdin)
|
|
for {
|
|
_, _ = fmt.Fprint(os.Stdout, "you> ")
|
|
if !scanner.Scan() {
|
|
break
|
|
}
|
|
line := strings.TrimSpace(scanner.Text())
|
|
if line == "" {
|
|
break
|
|
}
|
|
history = append(history, schema.UserMessage(line))
|
|
|
|
events := runner.Run(ctx, history)
|
|
content, err := printAndCollectAssistantFromEvents(events)
|
|
if err != nil {
|
|
_, _ = fmt.Fprintln(os.Stderr, err)
|
|
os.Exit(1)
|
|
}
|
|
history = append(history, schema.AssistantMessage(content, nil))
|
|
}
|
|
if err := scanner.Err(); err != nil {
|
|
_, _ = fmt.Fprintln(os.Stderr, err)
|
|
os.Exit(1)
|
|
}
|
|
}
|
|
|
|
func printAndCollectAssistantFromEvents(events *adk.AsyncIterator[*adk.AgentEvent]) (string, error) {
|
|
var sb strings.Builder
|
|
|
|
for {
|
|
event, ok := events.Next()
|
|
if !ok {
|
|
break
|
|
}
|
|
if event.Err != nil {
|
|
return "", event.Err
|
|
}
|
|
if event.Output == nil || event.Output.MessageOutput == nil {
|
|
continue
|
|
}
|
|
|
|
mv := event.Output.MessageOutput
|
|
if mv.Role != schema.Assistant {
|
|
continue
|
|
}
|
|
|
|
if mv.IsStreaming {
|
|
mv.MessageStream.SetAutomaticClose()
|
|
for {
|
|
frame, err := mv.MessageStream.Recv()
|
|
if errors.Is(err, io.EOF) {
|
|
break
|
|
}
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
if frame != nil && frame.Content != "" {
|
|
sb.WriteString(frame.Content)
|
|
_, _ = fmt.Fprint(os.Stdout, frame.Content)
|
|
}
|
|
}
|
|
_, _ = fmt.Fprintln(os.Stdout)
|
|
continue
|
|
}
|
|
|
|
if mv.Message != nil {
|
|
sb.WriteString(mv.Message.Content)
|
|
_, _ = fmt.Fprintln(os.Stdout, mv.Message.Content)
|
|
} else {
|
|
_, _ = fmt.Fprintln(os.Stdout)
|
|
}
|
|
}
|
|
|
|
return sb.String(), nil
|
|
}
|