通过ADK调用AI Agent,以及历史消息的保存

2026年1月12日 · 419 字 · 2 分钟

通过通过ADK调用AI Agent,实现一个活动策划大师",调用了一些工具

通过ADK调用AI Agent,以及历史消息的保存

通过通过ADK调用AI Agent

调用agent

func WeatherAgent() {
	ctx := context.Background()

	//创建model
	model := mytool.CreateDeepseekModel()//查看eino调用大模型文章
	//创建工具集
	tools := []tool.BaseTool{
		//时间
		mytool.CreateTimeTool(),//查看自行实现一个Eino工具文章
		//天气
		mytool.CreateWeatherTool(),//查看获取用户当前的位置坐标文章
		//位置
		mytool.CreateLocationTool(),//查看天气预报工具文章
	}
	//创建agent
	agent, err := adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{
		Name:        "activity_agent",
		Description: "活动策划大师",
		Instruction: "请根据未来天气安排活动", //一个agent可能是另一个agent的subagent,所以agent的功能需要描绘清楚
		Model:       model,
		ToolsConfig: adk.ToolsConfig{
			ToolsNodeConfig: compose.ToolsNodeConfig{
				Tools: tools,
			},
		},
	})
	if err != nil {
		panic(err)
	}
	//运行agent
	runner := adk.NewRunner(ctx, adk.RunnerConfig{
		Agent: agent,
	})
	//返回一个迭代器
	iter := runner.Query(ctx, "明天的天气适合开运动会吗")
	//循环迭代器
	for {
		//迭代器获取事件
		event, ok := iter.Next()
		if !ok {
			break
		}
		if event.Err != nil {
			panic(event.Err)
		}
		msg, err := event.Output.MessageOutput.GetMessage()
		if err != nil {
			panic(err)
		}
		fmt.Printf("%s:%s\n", msg.Role, msg.Content)
	}
}

调用结果

assistant:我需要知道您所在的城市才能查询明天的天气情况。让我先获取您的位置信息。
tool:当前位置: 省:内蒙古自治区 市:呼和浩特市 城市编码:150000
assistant:现在我来查询呼和浩特市明天的天气情况。
tool:天气预报: 白天天气: 晴, 夜晚天气: 晴, 白天温度: 0℃, 夜晚温度: -13℃, 白天风向: 西南, 夜晚风向: 西南, 白天风力: 1-3, 夜晚风力: 1-3
assistant:根据呼和浩特市明天的天气预报:

**天气情况:**
- 白天:晴,温度0℃
- 夜晚:晴,温度-13℃
- 风向:西南风,风力1-3级

**是否适合开运动会的分析:**

**优点:**
1. **晴天** - 没有雨雪,适合户外活动
2. **风力较小** - 1-3级风对运动会影响不大
3. **天气稳定** - 白天和夜晚都是晴天

**需要考虑的因素:**
1. **温度较低** - 白天0℃,对于运动会来说偏冷,特别是对于需要长时间在户外活动的运动员和观众
2. **早晚温差大** - 白天0℃,夜晚-13℃,温差较大

**建议:**
1. 如果必须举办,建议安排在中午时段(温度相对较高)
2. 提醒参与者做好保暖措施,穿着适当的运动服装
3. 准备热饮和取暖设施
4. 考虑缩短活动时间,避免长时间暴露在低温环境中

如果想要只看最后结果,不需要打印分析过程

func WeatherAgent() {
	ctx := context.Background()

	//创建model
	model := mytool.CreateDeepseekModel()
	............
    ............
	//返回一个迭代器
	iter := runner.Query(ctx, "明天的天气适合开运动会吗")
	//循环迭代器
	var lastMsg adk.Message
	for {
		............
        ............
		if err != nil {
			panic(err)
		}
		// fmt.Printf("%s:%s\n", msg.Role, msg.Content)
		lastMsg = msg
	}
	if lastMsg.Role == schema.Assistant && len(lastMsg.Content) > 0 {
		fmt.Println("lastMsg:", lastMsg.Content)
	}
}

最后结果

lastMsg: 根据呼和浩特市明天的天气预报:

**明天天气情况:**
- 白天:晴,温度0℃,西南风1-3级
- 夜晚:晴,温度-13℃,西南风1-3级

**是否适合开运动会:**

**适合的因素:**
1. **晴天**:没有雨雪,天气晴朗,适合户外活动
2. **风力适中**:1-3级微风,不会影响比赛
3. **能见度好**:晴天能见度高,适合各种运动项目

**需要注意的因素:**
1. **温度较低**:白天0℃,对运动员和观众来说可能有些冷
2. **早晚温差大**:白天0℃,夜晚-13℃,如果运动会持续到傍晚需要注意保暖

**建议:**
- 运动会可以正常举行,但要做好防寒保暖措施
- 建议运动员穿着适当的保暖运动服装
- 观众需要穿厚外套,准备热水等保暖物品
- 如果可能,尽量安排在中午前后温度相对较高的时段进行

总体来说,**明天适合开运动会**,天气条件良好,主要是需要注意防寒保暖。

历史消息的保存

就是定义一个消息切片,每次把问题和回答都append进入这个切片

func WeatherAgent() {
	ctx := context.Background()
    ..............
    ..............
	//运行agent
	runner := adk.NewRunner(ctx, adk.RunnerConfig{
		Agent: agent,
	})
	messages := []adk.Message{
		{Role: schema.User, Content: "明天的天气适合开运动会吗"},
	}

	//返回一个迭代器
	iter := runner.Run(ctx, messages)
	..............
    ..............
	if lastMsg.Role == schema.Assistant && len(lastMsg.Content) > 0 {
		fmt.Println("lastMsg:", lastMsg.Content)
		messages = append(messages, lastMsg)
	}
	fmt.Println("=======第一轮结束=======")
	messages = append(messages, &schema.Message{Role: schema.User, Content: "运动会的晚上会结冰吗"})
	//返回一个迭代器
	iter = runner.Run(ctx, messages)
	..............
    ..............
	fmt.Println("=======第二轮结束=======")
}

func main() {
	WeatherAgent()
}

最后调用结果

lastMsg: 根据呼和浩特市明天的天气预报:

**明天天气情况:**
- 白天:晴,气温0℃,西南风1-3级
- 夜晚:晴,气温-13℃,西南风1-3级

**关于是否适合开运动会的建议:**

**有利条件:**
1. **晴天无雨** - 非常适合户外活动
2. **风力较小** - 西南风1-3级,不会影响比赛
3. **天气稳定** - 全天都是晴天

**需要注意的方面:**
1. **温度较低** - 白天0℃,对于户外运动会来说偏冷
2. **早晚温差大** - 白天0℃到夜晚-13℃,温差较大

**建议:**
- **可以举办运动会**,但需要做好防寒保暖措施
- 建议运动员穿着适当的保暖运动服装
- 观众需要穿厚衣服,准备热水等保暖用品
- 如果可能,尽量将比赛安排在中午前后温度相对较高的时候
- 注意运动员热身要充分,避免因低温导致肌肉拉伤

总体来说,天气条件除了温度较低外,其他方面都很适合开运动会。只要做好防寒准备,是可以顺利举办的。
=======第一轮结束=======
lastMsg: 根据呼和浩特市明天的天气预报:

**明天晚上天气情况:**
- 天气:晴
- 温度:-13℃
- 风向:西南风
- 风力:1-3级

**关于晚上是否会结冰的分析:**

**会结冰的可能性很高,原因如下:**

1. **温度极低**:-13℃远低于水的冰点(0℃),这个温度下任何暴露在外的水都会迅速结冰。

2. **结冰风险因素:**
   - 运动会场地如果有积水或湿滑区域,会很快结冰
   - 洒水后的跑道、草坪等表面容易结冰
   - 饮用水、饮料等液体如果洒在地上会结冰
   - 运动员汗水形成的湿滑区域也可能结冰

3. **安全隐患:**
   - 结冰的地面非常滑,容易导致运动员和观众摔倒受伤
   - 运动器材表面结冰会影响使用
   - 夜间照明设备周围如果有水汽凝结也可能结冰

**建议措施:**
1. 运动会结束后立即清理场地上的积水
2. 检查跑道和运动场地是否有湿滑区域
3. 提醒运动员和工作人员注意地面结冰情况
4. 如果晚上有活动,需要特别注意防滑安全
5. 考虑在可能结冰的区域撒盐或使用防滑材料

**结论:** 在-13℃的温度下,运动会场地晚上**几乎肯定会结冰**,需要提前做好防滑和安全准备。
=======第二轮结束=======