开始
Go 版本要求
Eino 要求 Go 1.22 及以上版本
安装依赖
go get github.com/cloudwego/eino@latest
go get github.com/cloudwego/eino-ext/components/model/openai@latest
创建 API key
在 DeepSeek API 开放平台创建一个 API key
第一个 Eino 程序
创建一个 ChatModel
DeepSeek API 文档提供了 API 地址以及可用的模型

ctx := context.Background()
// 接入 DeepSeek API
chatModel, err := openai.NewChatModel(ctx, &openai.ChatModelConfig{
BaseURL: "https://api.deepseek.com",
APIKey: "Your API key",
Model: "deepseek-v4-flash",
})
if err != nil {
fmt.Println(fmt.Sprintf("创建 ChatModel 失败: %v", err))
}
同步调用(Generate)
// System Message:模型的全局设定(行为准则和角色定位),仅在对话开头设置一次
// User Message:用户的输入
// Assistant Message:模型生成的回复
messages := []*schema.Message{
schema.SystemMessage("你是一个专业的 Go 语言技术顾问,回答简洁准确"),
schema.UserMessage("用一句话解释什么是 goroutine"),
}
// 调用 Generate 方法,同步获取完整回复
response, err := chatModel.Generate(ctx, messages)
if err != nil {
fmt.Println(fmt.Sprintf("调用失败: %v", err))
}
fmt.Println("模型回复:")
fmt.Println(response.Content)
流式调用(Stream)
messages := []*schema.Message{
schema.SystemMessage("你是一个 Go 语言专家,擅长深入浅出地讲解技术概念"),
schema.UserMessage("请用 200 字左右解释 Go 语言的 channel 是什么,以及它在并发编程中的作用"),
}
// 调用 Stream 方法,获取流
stream, err := chatModel.Stream(ctx, messages)
if err != nil {
fmt.Println(fmt.Sprintf("调用失败: %v", err))
}
defer stream.Close()
fmt.Println("模型回复(流式):")
// 循环读取流式数据块
for {
chunk, err := stream.Recv()
// 当模型生成结束,Recv() 返回 io.EOF 错误
if errors.Is(err, io.EOF) {
break
}
if err != nil {
fmt.Println(fmt.Sprintf("读取失败: %v", err))
}
// 读取到一块立即输出
fmt.Print(chunk.Content)
}
fmt.Println()
多轮对话
// LLM 没有真正的记忆,多轮对话中,当前消息会和历史消息一起发送给模型
// 历史消息列表,先放入 System Message
history := []*schema.Message{
schema.SystemMessage("你是一个友好的 Go 语言助手,回答简洁,每次不超过 100 字"),
}
scanner := bufio.NewScanner(os.Stdin)
fmt.Println("开始对话(输入 quit 退出):")
for {
fmt.Print("\n你: ")
if !scanner.Scan() {
break
}
input := strings.TrimSpace(scanner.Text())
if input == "quit" {
fmt.Println("再见!")
break
}
if input == "" {
continue
}
// 追加 User Message
history = append(history, schema.UserMessage(input))
// 每轮对话都使用完整的历史消息列表
stream, err := chatModel.Stream(ctx, history)
if err != nil {
fmt.Println(fmt.Sprintf("调用失败: %v", err))
continue
}
fmt.Print("助手: ")
var reply strings.Builder
for {
chunk, err := stream.Recv()
if errors.Is(err, io.EOF) {
break
}
if err != nil {
fmt.Println(fmt.Sprintf("读取失败: %v", err))
break
}
fmt.Print(chunk.Content)
reply.WriteString(chunk.Content)
}
stream.Close()
fmt.Println()
// 追加 Assistant Message
history = append(history, &schema.Message{
Role: schema.Assistant,
Content: reply.String(),
})
}
完整代码
package main
import (
"bufio"
"context"
"errors"
"fmt"
"io"
"os"
"strings"
"github.com/cloudwego/eino-ext/components/model/openai"
"github.com/cloudwego/eino/schema"
)
func main() {
ctx := context.Background()
// 接入 DeepSeek API
chatModel, err := openai.NewChatModel(ctx, &openai.ChatModelConfig{
BaseURL: "https://api.deepseek.com",
APIKey: "Your API key",
Model: "deepseek-v4-flash",
})
if err != nil {
fmt.Println(fmt.Sprintf("创建 ChatModel 失败: %v", err))
}
// 同步调用
// System Message:模型的全局设定(行为准则和角色定位),仅在对话开头设置一次
// User Message:用户的输入
// Assistant Message:模型生成的回复
messages1 := []*schema.Message{
schema.SystemMessage("你是一个专业的 Go 语言技术顾问,回答简洁准确"),
schema.UserMessage("用一句话解释什么是 goroutine"),
}
// 调用 Generate 方法,同步获取完整回复
response, err := chatModel.Generate(ctx, messages1)
if err != nil {
fmt.Println(fmt.Sprintf("调用失败: %v", err))
}
fmt.Println("模型回复:")
fmt.Println(response.Content)
// 流式调用
messages2 := []*schema.Message{
schema.SystemMessage("你是一个 Go 语言专家,擅长深入浅出地讲解技术概念"),
schema.UserMessage("请用 200 字左右解释 Go 语言的 channel 是什么,以及它在并发编程中的作用"),
}
// 调用 Stream 方法,获取流
stream, err := chatModel.Stream(ctx, messages2)
if err != nil {
fmt.Println(fmt.Sprintf("调用失败: %v", err))
}
defer stream.Close()
fmt.Println("模型回复(流式):")
// 循环读取流式数据块
for {
chunk, err := stream.Recv()
// 当模型生成结束,Recv() 返回 io.EOF 错误
if errors.Is(err, io.EOF) {
break
}
if err != nil {
fmt.Println(fmt.Sprintf("读取失败: %v", err))
}
// 读取到一块立即输出
fmt.Print(chunk.Content)
}
fmt.Println()
// LLM 没有真正的记忆,多轮对话中,当前消息会和历史消息一起发送给模型
// 历史消息列表,先放入 System Message
history := []*schema.Message{
schema.SystemMessage("你是一个友好的 Go 语言助手,回答简洁,每次不超过 100 字"),
}
scanner := bufio.NewScanner(os.Stdin)
fmt.Println("开始对话(输入 quit 退出):")
for {
fmt.Print("\n你: ")
if !scanner.Scan() {
break
}
input := strings.TrimSpace(scanner.Text())
if input == "quit" {
fmt.Println("再见!")
break
}
if input == "" {
continue
}
// 追加 User Message
history = append(history, schema.UserMessage(input))
// 每轮对话都使用完整的历史消息列表
stream, err := chatModel.Stream(ctx, history)
if err != nil {
fmt.Println(fmt.Sprintf("调用失败: %v", err))
continue
}
fmt.Print("助手: ")
var reply strings.Builder
for {
chunk, err := stream.Recv()
if errors.Is(err, io.EOF) {
break
}
if err != nil {
fmt.Println(fmt.Sprintf("读取失败: %v", err))
break
}
fmt.Print(chunk.Content)
reply.WriteString(chunk.Content)
}
stream.Close()
fmt.Println()
// 追加 Assistant Message
history = append(history, &schema.Message{
Role: schema.Assistant,
Content: reply.String(),
})
}
}




