为第三方API设计工具

本节的任务是演示如何利用第三方API定义AI工具。

本节使用了百度地图的API,用于查询天气和路况。

百度地图API的地址:https://lbsyun.baidu.com/

参考代码如下,可直接在命令窗口测试执行:


Dim
caller As New LLMCaller("https://api.deepseek.com/chat/completions", "deepseek-flash", "sk-a734b83536da45e9aedc3e42605bfb3a")
caller.SystemPrompt =
"对于使用外部工具返回的结果,不得质疑篡改,无论结果对错,都直接使用即可,对于无法使用外部工具解决的问题,请依靠你的知识回复"
caller.Messages =
New JArray()  '开启多轮对话
'
定义三个工具,天气 + 路况 + 获取今日日期,天气和路况利用百度地图API实现
With
caller.AddTool("get_weather", "查询指定区县的综合天气信息,包括:实时天气(温度、体感、风力、湿度、天气现象、AQI等)、未来7天天气预报(每日最高/最低温度、白天/晚上天气现象及风力风向)、生活指数(晨练、穿衣、洗车等)、气象预警(如有)、未来24小时逐小时预报(温度、天气现象、风力、相对湿度、降水量等)。当用户询问天气时,优先提取区县名称(如'赤坎区'),如果用户同时提到了城市(如'湛江')和省份(如'广东'),也一并提取,以区分同名区县。")
    .AddParameter(
"province", "string", "省份名称,例如:广东省、山东省。当用户提到省份时提取,用于辅助定位区县。", False)
    .AddParameter(
"city", "string", "城市名称,例如:湛江市、济南市。当用户提到城市时提取,用于辅助定位区县。", False)
    .AddParameter(
"district", "string", "区县名称,例如:赤坎区、历下区。必须提取用户明确提到的区县名,这是查询天气的核心参数。", True)
End
With
With
caller.AddTool("get_traffic", "查询指定城市中某条道路的实时路况信息,包括整体通行状态、语义化描述、拥堵路段详情(拥堵距离、平均车速、拥堵趋势等)。当用户询问路况、堵车、道路通行情况时使用此工具。")
    .AddParameter(
"road_name", "string", "道路名称,例如:东二环、北五环、信息路。必须提取用户明确提到的道路名。", True)
    .AddParameter(
"city", "string", "城市名称,例如:北京市、上海市。必须提取用户明确提到的城市名。", True)
End
With
caller.AddTool(
"get_today_date", "获取当前系统日期,以 YYYY-MM-DD 格式返回。当用户询问今天几号、今天日期、当前日期等信息时使用此工具。无需任何参数")
Dim
ak As String = "bYDdADrPUCNkSAID9bJU70EF8Iy5htGu"  '请替换为自己的百度地图API Key
caller.ToolExecutor =

Function
(ttoolName As String, targs As JObject) As String
   
Dim hc As HttpClient = Nothing
   
Select Case ttoolName
       
Case "get_weather" '天气查询
           
Dim district As String = targs("district").ToString() '区县参数
           
Dim city As String = ""
           
Dim province As String = ""
           
If targs.ContainsKey("city") Then city = targs("city").ToString() '如果提供了城市名参数
           
If targs.ContainsKey("province") Then province = targs("province").ToString() '如果提供了省名称参数
           
Dim url As String = "https://api.map.baidu.com/weather/v1/"
           
Dim params As New List(Of String)
            params.Add(
"district=" & UrlEncode(district))
           
If Not String.IsNullOrEmpty(city) Then
                params.Add(
"city=" & UrlEncode(city))
           
End If
           
If Not String.IsNullOrEmpty(province) Then
                params.Add(
"province=" & UrlEncode(province))
           
End If
            params.Add(
"data_type=all") ' 获取全部数据(实时+预报+指数+预警+逐小时)
            params.Add(
"ak=" & ak)
            url &=
"?" & String.Join("&", params)
            hc =
New HttpClient(url)
       
Case "get_traffic" '路况查询
           
Dim road_name As String = targs("road_name").ToString() '获得路名
           
Dim city As String = targs("city").ToString() '获得城市名
           
Dim url As String = "https://api.map.baidu.com/traffic/v1/road?road_name=" & UrlEncode(road_name) & "&city=" & UrlEncode(city) & "&ak=" & ak
            hc =
New HttpClient(url)
       
Case "get_today_date"
           
Return Date.Now.ToString("yyyy-MM-dd")
       
Case Else
           
Return "未知工具:" & ttoolName
   
End Select
   
If hc IsNot Nothing Then
        hc.SkipError =
True
       
Dim ret As String = hc.GetData()
       
If hc.StatusCode = 200 Then
           
Return ret
       
Else
           
Return "{""StatusCode"":" & hc.StatusCode & ",""StatusDescription"":""" & hc.StatusDescription & """}"
       
End If
   
End If
End
Function
For
Each msg As String In {"湛江赤坎区的现在的天气如何?", "霞山呢?", "跃进路现在塞车吗?"}
    caller.UserMessage = msg
   
If caller.GetResult() Then
        MessageBox.Show(caller.Result)
   
End If
Next


本页地址:http://www.foxtable.com/webhelp/topics/7215.htm