Skip to content

Commit baa972e

Browse files
committed
feat(multimodal): 新增多模态输入的示例
1 parent 20fb012 commit baa972e

1 file changed

Lines changed: 92 additions & 0 deletions

File tree

examples/multimodal/main.go

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"encoding/base64"
6+
"fmt"
7+
"log"
8+
"os"
9+
10+
"github.com/cloudwego/eino-ext/components/model/openai"
11+
"github.com/joho/godotenv"
12+
"github.com/wsshow/agentkit"
13+
)
14+
15+
func main() {
16+
ctx := context.Background()
17+
18+
if err := godotenv.Load(); err != nil {
19+
log.Fatalln(err)
20+
}
21+
22+
chatModel, err := openai.NewChatModel(ctx, &openai.ChatModelConfig{
23+
APIKey: os.Getenv("FEIKONG_OPENAI_API_KEY"),
24+
BaseURL: os.Getenv("FEIKONG_OPENAI_BASE_URL"),
25+
Model: os.Getenv("FEIKONG_OPENAI_MODEL"),
26+
})
27+
if err != nil {
28+
log.Fatalln(err)
29+
}
30+
31+
agent, err := agentkit.New(ctx, &agentkit.Config{
32+
Name: "vision-assistant",
33+
SystemPrompt: "你是一个视觉助手,擅长描述和分析图片内容。回答请简洁明了。",
34+
Model: chatModel,
35+
})
36+
if err != nil {
37+
log.Fatalln(err)
38+
}
39+
defer agent.Close()
40+
41+
agent.Subscribe(func(e agentkit.Event) {
42+
switch e.Type {
43+
case agentkit.EventReasoningDelta:
44+
fmt.Print(e.Delta)
45+
case agentkit.EventMessageDelta:
46+
fmt.Print(e.Delta)
47+
case agentkit.EventMessageEnd:
48+
fmt.Println()
49+
case agentkit.EventError:
50+
fmt.Printf("[错误] %v\n", e.Error)
51+
}
52+
})
53+
54+
// ── 场景 1:文本 + 图片 URL ──────────────────────────────────────────────
55+
// 注意:必须使用图片的直链(返回图片二进制),不能使用 HTML 页面链接。
56+
// GitHub 图片直链格式:https://raw.githubusercontent.com/{owner}/{repo}/{branch}/{path}
57+
fmt.Println("═══ 场景 1:文本 + 图片 URL ═══")
58+
fmt.Print("\n用户: [图片] 这张图片里有什么?\n助手: ")
59+
60+
if err := agent.Send(ctx,
61+
agentkit.Text("这张图片里有什么?"),
62+
agentkit.ImageURL("https://raw.githubusercontent.com/wsshow/feikong-teams/main/docs/images/fkteams.png"),
63+
); err != nil {
64+
log.Fatalln(err)
65+
}
66+
67+
// ── 场景 2:本地图片(Base64) ───────────────────────────────────────────
68+
// 当 API 无法访问外部 URL 时,可使用 Base64 编码发送本地图片。
69+
fmt.Println("\n═══ 场景 2:本地图片(Base64) ═══")
70+
fmt.Print("\n用户: [本地图片] 描述一下这张图片\n助手: ")
71+
72+
imgData, err := os.ReadFile("test.png") // 替换为你的本地图片路径
73+
if err != nil {
74+
fmt.Println("(跳过:未找到 test.png,请放置一张图片到当前目录)")
75+
} else {
76+
b64 := base64.StdEncoding.EncodeToString(imgData)
77+
if err := agent.Send(ctx,
78+
agentkit.Text("描述一下这张图片"),
79+
agentkit.ImageBase64(b64, "image/png"),
80+
); err != nil {
81+
log.Fatalln(err)
82+
}
83+
}
84+
85+
// ── 场景 3:追问(纯文本,依赖上下文) ───────────────────────────────────
86+
fmt.Println("\n═══ 场景 3:追问(纯文本,依赖上下文) ═══")
87+
fmt.Print("\n用户: 你刚才看到的图片是关于什么主题的?\n助手: ")
88+
89+
if err := agent.Prompt(ctx, "你刚才看到的图片是关于什么主题的?"); err != nil {
90+
log.Fatalln(err)
91+
}
92+
}

0 commit comments

Comments
 (0)