应用调用
更新时间:2025-03-11
简介
AppBuilderClient组件支持调用在百度智能云千帆AppBuilder 平台上通过AppBuilderClient构建并发布的智能体应用。
功能介绍
具体包括创建会话、上传文档、运行对话等
特色优势
与云端Console 应用能力打通,实现低代码会话
应用场景
快速、高效集成云端已发布智能体应用能力
Python基本用法
AppBuilderClient().__init__()
方法参数
参数名称 | 参数类型 | 描述 | 示例值 |
---|---|---|---|
app_id | string | 线上Agent应用的ID | "正确的应用ID" |
方法返回值
AppBuilderClient
实例化对象
AppBuilderClient().create_conversation()-> str
方法参数
无
方法返回值
参数名称 | 参数类型 | 描述 | 示例值 |
---|---|---|---|
conversation_id | string | 会话的ID | "80c5bbee-931d-4ed9-a4ff-63e1971bd071" |
AppBuilderClient().upload_local_file(conversation_id, file_path: str)-> str
方法参数
参数名称 | 参数类型 | 描述 | 示例值 |
---|---|---|---|
conversation_Id | string | 会话ID | |
file_path | string | 文件路径 | "正确的文件路径" |
方法返回值
参数名称 | 参数类型 | 描述 | 示例值 |
---|---|---|---|
file_id | string | 文件ID | "80c5bbee-931d-4ed9-a4ff-63e1971bd |
AppBuilderClient().upload_file(conversation_id, local_file_path: str=None, file_url: str=None)-> str
方法参数
参数名称 | 参数类型 | 描述 | 示例值 |
---|---|---|---|
conversation_Id | string | 会话ID | |
file_path | string | 文件路径 | "正确的文件路径" |
file_url | string | 文件url |
方法返回值
参数名称 | 参数类型 | 描述 | 示例值 |
---|---|---|---|
file_id | string | 文件ID | "80c5bbee-931d-4ed9-a4ff-63e1971bd |
AppBuilderClient().run() -> Message
方法参数
参数名称 | 参数类型 | 是否必须 | 描述 | 示例值 |
---|---|---|---|---|
conversation_id | String | 是 | 会话ID | |
query | String | 否 | query问题内容 | "今天天气怎么样?" |
stream | Bool | 否 | 为true时则流式返回,为false时则一次性返回所有内容, 推荐设为true,降低首token时延 | False |
tools | List[Tool] | 否 | 一个列表,其中每个字典对应一个工具的配置 | |
tools[0] | Tool | 否 | 工具配置 | |
+type | String | 否 | 枚举: file_retrieval: 知识库检索工具能够理解文档内容,支持用户针对文档内容的问答。 code_interpreter: 代码解释器, 代码解释器能够生成并执行代码,从而协助用户解决复杂问题,涵盖科学计算(包括普通数学计算题)、数据可视化、文件编辑处理(图片、PDF文档、视频、音频等)、文件格式转换(如WAV、MP3、text、SRT、PNG、jpg、MP4、GIF、MP3等)、数据分析&清洗&处理(文件以excel、csv格式为主)、机器学习&深度学习建模&自然语言处理等多个领域。 function: 支持fucntion call模式调用工具 |
|
+function | Function | 否 | Function工具描述 仅当type为 **function** 时需要且必须填写 |
|
++name | String | 否 | 函数名 只允许数字、大小写字母和中划线和下划线,最大长度为64个字符。一次运行中唯一。 |
|
++description | String | 否 | 工具描述 | |
++parameters | Dict | 否 | 工具参数, json_schema格式 | |
tool_outputs | List[ToolOutput] | 否 | 内容为本地的工具执行结果,以自然语言/json dump str描述 | |
tool_outputs[0] | ToolOutput | 否 | 工具执行结果 | |
+tool_call_id | String | 否 | 工具调用ID | |
+output | String | 否 | 工具输出 |
Run方法非流式返回值
Run非流式方法返回一个Message
对象,该对象包含以下属性:
参数名称 | 参数类型 | 描述 | 示例值 |
---|---|---|---|
content | AppBuilderClientAnswer | 对话返回结果 | |
+answer | String | 智能体应用返回的回答 | |
+events | List[Event] | 事件列表 | |
+events[0] | Event | 具体事件内容 | |
++code | String | 错误码 | |
++message | String | 错误具体消息 | |
++status | String | 事件状态 | 状态描述,preparing(准备运行)running(运行中)error(执行错误) done(执行完成) |
++event_type | String | 事件类型 | |
++content_type | String | 内容类型 | 可选值包括:code text, image, status,image, function_call, rag, audio、video等 |
++detail | Dict | 事件输出详情 | 代码解释器、文生图、工具组件、RAG等的详细输出内容 |
++usage | Usage | 模型调用的token用量 | Usage(prompt_tokens=1322, completion_tokens=80, total_tokens=1402, name='ERNIE-4.0-8K') |
AppBuilderClientAnswer
类型定义如下:
Python
1class AppBuilderClientAnswer(BaseModel):
2 """执行步骤的具体内容
3 属性:
4 answer(str): query回答内容
5 events( list[Event]): 事件列表
6 """
7 answer: str = ""
8 events: list[Event] = []
Event
类型定义如下:
Python
1class Event(BaseModel):
2 """执行步骤的具体内容
3 属性:
4 code (int): 响应code码
5 message (str): 错误详情
6 status (str): 状态描述,preparing(准备运行)running(运行中)error(执行错误) done(执行完成)
7 event_type(str): 事件类型
8 content_type(str): 内容类型
9 detail(dict): 事件详情
10 usage(Usage): 大模型调用的token用量
11 """
12 code: int = 0
13 message: str = ""
14 status: str = ""
15 event_type: str = ""
16 content_type: str = ""
17 detail: dict = {}
18 usage: Optional[Usage] = None
Run方法流式返回值
参数名称 | 参数类型 | 描述 | 示例值 |
---|---|---|---|
content | Python Generator | 可迭代,每次迭代返回AppBuilderClientAnswer类型 | 无 |
非流式调用示例
Python
1import appbuilder
2import os
3
4# 请前往千帆AppBuilder官网创建密钥,流程详见:https://cloud.baidu.com/doc/AppBuilder/s/Olq6grrt6#1%E3%80%81%E5%88%9B%E5%BB%BA%E5%AF%86%E9%92%A5
5# 设置环境变量
6os.environ["APPBUILDER_TOKEN"] = '...'
7app_id = '...' # 已发布AppBuilder应用ID,可在console端查看
8# 初始化智能体
9builder = appbuilder.AppBuilderClient(app_id)
10# 创建会话
11conversation_id = builder.create_conversation()
12# 运行对话
13out = builder.run(conversation_id, "北京今天天气怎么样")
14# 打印会话结果
15print(out.content.answer)
流式调用示例
Python
1import appbuilder
2from appbuilder.core.console.appbuilder_client import data_class
3import os
4
5# 请前往千帆AppBuilder官网创建密钥,流程详见:https://cloud.baidu.com/doc/AppBuilder/s/Olq6grrt6#1%E3%80%81%E5%88%9B%E5%BB%BA%E5%AF%86%E9%92%A5
6# 设置环境变量
7os.environ["APPBUILDER_TOKEN"] = '...'
8app_id = '...' # 已发布AppBuilder应用的ID
9# 初始化智能体
10client = appbuilder.AppBuilderClient(app_id)
11# 创建会话
12conversation_id = client.create_conversation()
13
14# 上传一个介绍某汽车产品的说明文档
15file_id = client.upload_local_file(conversation_id, "/path/to/pdf/file")
16# 引用上传的文档,开始对话
17# 注意file_ids不是必填项,如果不需要引用特定文档,file_ids留空即可
18message = client.run(conversation_id, "汽车性能参数怎么样", file_ids=[file_id, ], stream=True)
19
20answer = ""
21
22# 每次迭代返回AppBuilderClientAnswer结构,内可能包括多个事件内容
23for content in message.content:
24 # stream=True时,将answer拼接起来才是完整的的对话结果
25 answer += content.answer
26 for event in content.events:
27 content_type = event.content_type
28 detail = event.detail
29 # 根据content类型对事件详情进行解析
30 if content_type == "code":
31 code_detail = data_class.CodeDetail(**detail)
32 print(code_detail.code)
33 elif content_type == "text":
34 text_detail = data_class.TextDetail(**detail)
35 print(text_detail.text)
36 elif content_type == "image":
37 image_detail = data_class.ImageDetail(**detail)
38 print(image_detail.url)
39 elif content_type == "rag":
40 rag_detail = data_class.RAGDetail(**detail)
41 if len(rag_detail.references) > 0:
42 print(rag_detail.references)
43 elif content_type == "function_call":
44 function_call_detail = data_class.FunctionCallDetail(**detail)
45 print(function_call_detail.video)
46 elif content_type == "audio":
47 audio_detail = data_class.AudioDetail(**detail)
48 print(audio_detail)
49 elif content_type == "video":
50 video_detail = data_class.VideoDetail(**detail)
51 print(video_detail)
52 elif content_type == "status":
53 status_detail = data_class.StatusDetail(**detail)
54 print(status_detail)
55 else:
56 default_detail = data_class.DefaultDetail(**detail)
57 print(default_detail)
58
59# 打印完整的answer结果
60print(answer)
Java基本用法
new AppBuilderClient(appId)
方法参数
参数名称 | 参数类型 | 描述 | 示例值 |
---|---|---|---|
appID | String | 线上Agent应用的ID | "正确的应用ID" |
方法返回值
AppBuilderClient
实例化对象
AppBuilderClient().createConversation()
方法参数
无
方法返回值
参数名称 | 参数类型 | 描述 | 示例值 |
---|---|---|---|
conversationId | String | 创建的会话ID | "正确的会话ID" |
AppBuilderClient().run()
Run方法入参
参数名称 | 参数类型 | 是否必须 | 描述 | 示例值 |
---|---|---|---|---|
query | String | 是 | query内容 | "汽车性能参数怎么样" |
conversationId | String | 是 | 对话id,可以通过createConversation()获取 | |
fileIds | String[] | 否 | 对话可引用的文档ID | |
stream | boolean | 是 | 为true时则流式返回,为false时则一次性返回所有内容, 推荐设为true,降低首token时延 |
Run方法出参
参数名称 | 参数类型 | 描述 | 示例值 |
---|---|---|---|
AppBuilderClientIterator | AppBuilderClientIterator | 回答迭代器,流式/非流式均统一返回该类型,每次迭代返回AppBuilderClientIterator类型 |
迭代AppBuilderClientIterator
参数名称 | 参数类型 | 描述 | 示例值 |
---|---|---|---|
+answer | String | 智能体应用返回的回答 | |
+events | Event[] | 事件列表 | |
+events[0] | Event | 具体事件内容 | |
++code | string | 错误码 | |
++message | string | 错误具体消息 | |
++status | string | 事件状态 | 状态描述,preparing(准备运行)running(运行中)error(执行错误) done(执行完成) |
++eventType | string | 事件类型 | |
++contentType | string | 内容类型 | 可选值包括:code text, image, status,image, function_call, rag, audio、video等 |
++detail | Map<String, Object> | 事件输出详情 | 代码解释器、文生图、工具组件、RAG等的详细输出内容 |
++usage | Usage | 模型调用的token用量 | Usage(prompt_tokens=1322, completion_tokens=80, total_tokens=1402, name='ERNIE-4.0-8K') |
示例代码
Java
1package org.example;
2
3import java.io.IOException;
4import java.util.*;
5
6import com.google.gson.annotations.SerializedName;
7
8import com.baidubce.appbuilder.base.exception.AppBuilderServerException;
9import com.baidubce.appbuilder.console.appbuilderclient.AppBuilderClient;
10import com.baidubce.appbuilder.model.appbuilderclient.AppBuilderClientIterator;
11import com.baidubce.appbuilder.model.appbuilderclient.AppBuilderClientResult;
12import com.baidubce.appbuilder.model.appbuilderclient.Event;
13import com.baidubce.appbuilder.base.utils.json.JsonUtils;
14
15class AppBuilderClientDemo {
16
17 public static void main(String[] args) throws IOException, AppBuilderServerException {
18 System.setProperty("APPBUILDER_TOKEN", "请设置正确的应用密钥");
19 String appId = "请设置正确的应用ID";
20 AppBuilderClient builder = new AppBuilderClient(appId);
21 String conversationId = builder.createConversation();
22 // 填写上传文件路径
23 String fileId = builder.uploadLocalFile(conversationId, "/Users/zhangxiaoyu15/PycharmProjects/app-builder/test_app_builder_client/test.pdf");
24 // 输入query
25 // 注意file_ids不是必填项,如果不需要引用特定文档,则将new String[]{fileId}更换为new String[]{}即可
26 AppBuilderClientIterator itor = builder.run("中国四大传统节日是哪四个", conversationId, new String[]{fileId}, false);
27 StringBuilder answer = new StringBuilder();
28 // itor.hasNext()返回false时,表示流式调用结束
29 while(itor.hasNext())
30 {
31 AppBuilderClientResult response = itor.next();
32 answer.append(response.getAnswer());
33 for (Event event : response.getEvents()) {
34 switch (event.getContentType()) {
35 case "rag":
36 List<Object> references = (List<Object>)event.getDetail().get("references");
37 for (Object reference : references) {
38 ReferenceDetail ragDetail = JsonUtils.deserialize(JsonUtils.serialize(reference), ReferenceDetail.class);
39 System.out.println("-----------------------------------");
40 System.out.println("参考文献ID:"+ragDetail.getId());
41 System.out.println("参考文献内容:"+ragDetail.getContent());
42 System.out.println("来源:"+ragDetail.getFrom());
43 System.out.println("BaiduSearch链接:"+ragDetail.getUrl());
44 System.out.println("类型:"+ragDetail.getType());
45 System.out.println("文档片段ID:"+ragDetail.getSegmentId());
46 System.out.println("文档ID:"+ragDetail.getDocumentId());
47 System.out.println("文档名称:"+ragDetail.getDocumentName());
48 System.out.println("文档所属数据集ID:"+ragDetail.getDatasetId());
49 System.out.println("-----------------------------------");
50 }
51 break;
52 default:
53 // System.out.println(event);
54 }
55 }
56 }
57 System.out.print("输出:");
58 System.out.println(answer);
59 }
60}
61
62class ReferenceDetail {
63 private int id;
64 private String content;
65 private String from;
66 private String url;
67 private String type;
68 @SerializedName("segment_id")
69 private String segmentId;
70 @SerializedName("document_id")
71 private String documentId;
72 @SerializedName("document_name")
73 private String documentName;
74 @SerializedName("dataset_id")
75 private String datasetId;
76
77 public int getId() {
78 return id;
79 }
80
81 public void setId(int id) {
82 this.id = id;
83 }
84
85 public String getContent() {
86 return content;
87 }
88
89 public void setContent(String content) {
90 this.content = content;
91 }
92
93 public String getFrom() {
94 return from;
95 }
96
97 public void setFrom(String from) {
98 this.from = from;
99 }
100
101 public String getUrl() {
102 return url;
103 }
104
105 public void setUrl(String url) {
106 this.url = url;
107 }
108
109 public String getType() {
110 return type;
111 }
112
113 public void setType(String type) {
114 this.type = type;
115 }
116
117 public String getSegmentId() {
118 return segmentId;
119 }
120
121 public void setSegmentId(String segmentId) {
122 this.segmentId = segmentId;
123 }
124
125 public String getDocumentId() {
126 return documentId;
127 }
128
129 public void setDocumentId(String documentId) {
130 this.documentId = documentId;
131 }
132
133 public String getDocumentName() {
134 return documentName;
135 }
136
137 public void setDocumentName(String documentName) {
138 this.documentName = documentName;
139 }
140
141 public String getDatasetId() {
142 return datasetId;
143 }
144
145 public void setDatasetId(String datasetId) {
146 this.datasetId = datasetId;
147 }
148
149 @Override
150 public String toString() {
151 return "RAGReference{" +
152 "id=" + id +
153 ", content='" + content + '\'' +
154 ", from='" + from + '\'' +
155 ", url='" + url + '\'' +
156 ", type='" + type + '\'' +
157 ", segmentId='" + segmentId + '\'' +
158 ", documentId='" + documentId + '\'' +
159 ", documentName='" + documentName + '\'' +
160 ", datasetId='" + datasetId + '\'' +
161 '}';
162 }
163}
Run方法带ToolCall调用示例
Plain Text
1java
2package org.example;
3
4import java.io.IOException;
5import java.util.*;
6
7import com.google.gson.annotations.SerializedName;
8
9import com.baidubce.appbuilder.base.exception.AppBuilderServerException;
10import com.baidubce.appbuilder.console.appbuilderclient.AppBuilderClient;
11import com.baidubce.appbuilder.model.appbuilderclient.AppBuilderClientIterator;
12import com.baidubce.appbuilder.model.appbuilderclient.AppBuilderClientResult;
13import com.baidubce.appbuilder.model.appbuilderclient.Event;
14import com.baidubce.appbuilder.base.utils.json.JsonUtils;
15
16class AppBuilderClientDemo {
17
18 public static void main(String[] args) throws IOException, AppBuilderServerException {
19 System.setProperty("APPBUILDER_TOKEN", "请设置正确的应用密钥");
20 String appId = "请设置正确的应用ID";
21 AppBuilderClient builder = new AppBuilderClient(appId);
22 String conversationId = builder.createConversation();
23
24 AppBuilderClientRunRequest request = new AppBuilderClientRunRequest();
25 request.setAppId(appId);
26 request.setConversationID(conversationId);
27 request.setQuery("今天北京的天气怎么样?");
28 request.setStream(false);
29
30 String name = "get_cur_whether";
31 String desc = "这是一个获得指定地点天气的工具";
32 Map<String, Object> parameters = new HashMap<>();
33
34 Map<String, Object> location = new HashMap<>();
35 location.put("type", "string");
36 location.put("description", "省,市名,例如:河北省");
37
38 Map<String, Object> unit = new HashMap<>();
39 unit.put("type", "string");
40 List<String> enumValues = new ArrayList<>();
41 enumValues.add("摄氏度");
42 enumValues.add("华氏度");
43 unit.put("enum", enumValues);
44
45 Map<String, Object> properties = new HashMap<>();
46 properties.put("location", location);
47 properties.put("unit", unit);
48
49 parameters.put("type", "object");
50 parameters.put("properties", properties);
51 List<String> required = new ArrayList<>();
52 required.add("location");
53 parameters.put("required", required);
54
55 AppBuilderClientRunRequest.Tool.Function func =
56 new AppBuilderClientRunRequest.Tool.Function(name, desc, parameters);
57 AppBuilderClientRunRequest.Tool tool =
58 new AppBuilderClientRunRequest.Tool("function", func);
59 request.setTools(new AppBuilderClientRunRequest.Tool[] {tool});
60
61 AppBuilderClientIterator itor = builder.run(request);
62 assertTrue(itor.hasNext());
63 String ToolCallID = "";
64 while (itor.hasNext()) {
65 AppBuilderClientResult result = itor.next();
66 ToolCallID = result.getEvents()[0].getToolCalls()[0].getId();
67 System.out.println(result);
68 }
69
70 AppBuilderClientRunRequest request2 = new AppBuilderClientRunRequest();
71 request2.setAppId(appId);
72 request2.setConversationID(conversationId);
73
74 AppBuilderClientRunRequest.ToolOutput output =
75 new AppBuilderClientRunRequest.ToolOutput(ToolCallID, "北京今天35度");
76 request2.setToolOutputs(new AppBuilderClientRunRequest.ToolOutput[] {output});
77 AppBuilderClientIterator itor2 = builder.run(request2);
78 assertTrue(itor2.hasNext());
79 while (itor2.hasNext()) {
80 AppBuilderClientResult result = itor2.next();
81 System.out.println(result);
82 }
83 }
84}
Go基本用法
NewAppBuilderClient()
方法参数
参数名称 | 参数类型 | 描述 | 示例值 |
---|---|---|---|
app_id | string | 线上Agent应用的ID | "正确的应用ID" |
config | SDKConfig | SDK配置信息 |
CreateConversation()
方法入参
无
方法出参
参数名称 | 参数类型 | 描述 | 示例值 |
---|---|---|---|
conversation | str | 创建成功的对话对象,后续操作都基于该对象进行 |
Run()
Run方法入参
参数名称 | 参数类型 | 是否必须 | 描述 | 示例值 |
---|---|---|---|---|
conversationID | string | 是 | 对话ID,可以通过CreateConversation()获取 | |
query | string | 是 | query内容 | "汽车性能参数怎么样" |
stream | bool | 是 | 为true时则流式返回,为false时则一次性返回所有内容, 推荐设为true,降低首token时延 | |
file_ids | list[String] | 否 | 对话可引用的文档ID |
Run方法出参
参数名称 | 参数类型 | 描述 | 示例值 |
---|---|---|---|
AppBuilderClientIterator | AppBuilderClientIterator | 回答迭代器,流式/非流式均统一返回该类型 | |
error | error | 存在错误时error不为nil,反之 |
迭代AgentBuilderIterator
参数名称 | 参数类型 | 描述 | 示例值 |
---|---|---|---|
+Answer | string | 智能体应用返回的回答 | |
+Events | []Event | 事件列表 | |
+Events[0] | Event | 具体事件内容 | |
++Code | string | 错误码 | |
++Message | string | 错误具体消息 | |
++Status | string | 事件状态 | 状态描述,preparing(准备运行)running(运行中)error(执行错误) done(执行完成) |
++EventType | string | 事件类型 | |
++ContentType | string | 内容类型 | 可选值包括:code text, image, status,image, function_call, rag, audio、video等 |
++Detail | interface{} | 事件输出详情 | 代码解释器、文生图、工具组件、RAG等的详细输出内容 |
++Usage | Usage | 模型调用的token用量 | Usage(prompt_tokens=1322, completion_tokens=80, total_tokens=1402, name='ERNIE-4.0-8K') |
示例代码
Plain Text
1Go
2package main
3
4import (
5 "errors"
6 "fmt"
7 "io"
8 "os"
9
10 "github.com/baidubce/app-builder/go/appbuilder"
11)
12
13func main() {
14 // 设置APPBUILDER_TOKEN、GATEWAY_URL_V2环境变量
15 os.Setenv("APPBUILDER_TOKEN", "请设置正确的应用密钥")
16 // 默认可不填,默认值是 https://qianfan.baidubce.com
17 os.Setenv("GATEWAY_URL_V2", "")
18 config, err := appbuilder.NewSDKConfig("", "")
19 if err != nil {
20 fmt.Println("new config failed: ", err)
21 return
22 }
23 // 初始化实例
24 appID := "请填写正确的应用ID"
25 builder, err := appbuilder.NewAppBuilderClient(appID, config)
26 if err != nil {
27 fmt.Println("new agent builder failed: ", err)
28 return
29 }
30 // 创建对话ID
31 conversationID, err := builder.CreateConversation()
32 if err != nil {
33 fmt.Println("create conversation failed: ", err)
34 return
35 }
36 // 与创建应用时绑定的知识库不同之处在于,
37 // 所上传文件仅在本次会话ID下发生作用,如果创建新的会话ID,上传的文件自动失效
38 // 而知识库在不同的会话ID下均有效
39 fileID, err := builder.UploadLocalFile(conversationID, "/path/to/cv.pdf")
40 if err != nil {
41 fmt.Println("upload local file failed:", err)
42 return
43 }
44 // 执行流式对话
45 // 注意file_ids不是必填项,如果不需要引用特定的文档,则将[]string{fileID}更换为nil即可
46 // 同时还需要将上文的fileID, err := builder.UploadLocalFile(conversationID, "/path/to/cv.pdf")代码
47 // 更换为 _, err = client.UploadLocalFile(conversationID, "/path/to/cv.pdf"),否则会报错
48 i, err := builder.Run(conversationID, "描述简历中的候选人情况", []string{fileID}, true)
49 if err != nil {
50 fmt.Println("run failed: ", err)
51 return
52 }
53
54 completedAnswer := ""
55 var answer *appbuilder.AppBuilderClientAnswer
56 for answer, err = i.Next(); err == nil; answer, err = i.Next() {
57 completedAnswer = completedAnswer + answer.Answer
58 for _, ev := range answer.Events {
59 evJSON, _ := json.Marshal(ev)
60 fmt.Println(string(evJSON))
61 }
62 }
63 // 迭代正常结束err应为io.EOF
64 if errors.Is(err, io.EOF) {
65 fmt.Println("run success")
66 fmt.Println("智能体回答内容: ", completedAnswer)
67 } else {
68 fmt.Println("run failed:", err)
69 }
70}
RunWithToolCall()
Run方法入参
AppBuilderClientRunRequest
参数名称 | 参数类型 | 是否必须 | 描述 | 示例值 |
---|---|---|---|---|
ConversationID | string | 是 | 对话ID,可以通过CreateConversation()获取 | |
Query | string | 是 | query内容 | "汽车性能参数怎么样" |
Stream | bool | 是 | 为true时则流式返回,为false时则一次性返回所有内容, 推荐设为true,降低首token时延 | |
AppID | string | 是 | 应用ID,线上Agent应用的ID | |
Tools | []Tool | 否 | 一个列表,其中每个字典对应一个工具的配置 | |
ToolOuptus | []ToolOupt | 否 | 内容为本地的工具执行结果,以自然语言/json dump str描述 |
Tool
、ToolOutput
定义如下:
Go
1type Tool struct {
2 Type string `json:"type"`
3 Function Function `json:"function"`
4}
5
6type Function struct {
7 Name string `json:"name"`
8 Description string `json:"description"`
9 Parameters map[string]interface{} `json:"parameters"`
10}
11
12type ToolOutput struct {
13 ToolCallID string `json:"tool_call_id" description:"工具调用ID"`
14 Output string `json:"output" description:"工具输出"`
15}
Run方法出参
参数名称 | 参数类型 | 描述 | 示例值 |
---|---|---|---|
AppBuilderClientIterator | AppBuilderClientIterator | 回答迭代器,流式/非流式均统一返回该类型 | |
error | error | 存在错误时error不为nil,反之 |
迭代AgentBuilderIterator
参数名称 | 参数类型 | 描述 | 示例值 |
---|---|---|---|
+Answer | string | 智能体应用返回的回答 | |
+Events | []Event | 事件列表 | |
+Events[0] | Event | 具体事件内容 | |
++Code | string | 错误码 | |
++Message | string | 错误具体消息 | |
++Status | string | 事件状态 | 状态描述,preparing(准备运行)running(运行中)error(执行错误) done(执行完成) |
++EventType | string | 事件类型 | |
++ContentType | string | 内容类型 | 可选值包括:code text, image, status,image, function_call, rag, audio、video等 |
++Detail | interface{} | 事件输出详情 | 代码解释器、文生图、工具组件、RAG等的详细输出内容 |
++Usage | Usage | 模型调用的token用量 | Usage(prompt_tokens=1322, completion_tokens=80, total_tokens=1402, name='ERNIE-4.0-8K') |
示例代码
Go
1package main
2
3import (
4 "errors"
5 "fmt"
6 "io"
7 "os"
8
9 "github.com/baidubce/app-builder/go/appbuilder"
10)
11
12func main() {
13 // 设置APPBUILDER_TOKEN、GATEWAY_URL_V2环境变量
14 os.Setenv("APPBUILDER_TOKEN", "请设置正确的应用密钥")
15 // 默认可不填,默认值是 https://qianfan.baidubce.com
16 os.Setenv("GATEWAY_URL_V2", "")
17 config, err := appbuilder.NewSDKConfig("", "")
18 if err != nil {
19 fmt.Println("new config failed: ", err)
20 return
21 }
22 // 初始化实例
23 appID := "请填写正确的应用ID"
24 builder, err := appbuilder.NewAppBuilderClient(appID, config)
25 if err != nil {
26 fmt.Println("new agent builder failed: ", err)
27 return
28 }
29 // 创建对话ID
30 conversationID, err := builder.CreateConversation()
31 if err != nil {
32 fmt.Println("create conversation failed: ", err)
33 return
34 }
35
36 parameters := make(map[string]interface{})
37
38 location := make(map[string]interface{})
39 location["type"] = "string"
40 location["description"] = "省,市名,例如:河北省"
41
42 unit := make(map[string]interface{})
43 unit["type"] = "string"
44 unit["enum"] = []string{"摄氏度", "华氏度"}
45
46 properties := make(map[string]interface{})
47 properties["location"] = location
48 properties["unit"] = unit
49
50 parameters["type"] = "object"
51 parameters["properties"] = properties
52 parameters["required"] = []string{"location"}
53
54 i, err := client.RunWithFunctionCall(appbuilder.AppBuilderClientRunRequest{
55 AppID: appID,
56 Query: "今天北京的天气怎么样?",
57 ConversationID: conversationID,
58 Stream: true,
59 Tools: []appbuilder.Tool{
60 {
61 Type: "function",
62 Function: appbuilder.Function{
63 Name: "get_cur_whether",
64 Description: "这是一个获得指定地点天气的工具",
65 Parameters: parameters,
66 },
67 },
68 },
69 })
70 if err != nil {
71 fmt.Println("run failed:", err)
72 }
73 totalAnswer := ""
74 toolCallID := ""
75 for answer, err := i.Next(); err == nil; answer, err = i.Next() {
76 totalAnswer = totalAnswer + answer.Answer
77 for _, ev := range answer.Events {
78 toolCallID = ev.ToolCalls[0].ID
79 evJSON, _ := json.Marshal(ev)
80 fmt.Println(string(evJSON))
81 }
82 }
83
84 i2, err := client.RunWithFunctionCall(appbuilder.AppBuilderClientRunRequest{
85 ConversationID: conversationID,
86 AppID: appID,
87 ToolOutputs: []appbuilder.ToolOutput{
88 {
89 ToolCallID: toolCallID,
90 Output: "北京今天35度",
91 },
92 },
93 Stream: true,
94 })
95
96 if err != nil {
97 fmt.Println("run failed: ", err)
98 }
99
100 for answer, err := i2.Next(); err == nil; answer, err = i2.Next() {
101 totalAnswer = totalAnswer + answer.Answer
102 for _, ev := range answer.Events {
103 evJSON, _ := json.Marshal(ev)
104 fmt.Println(string(evJSON))
105 }
106 }
107
108 fmt.Println("----------------answer-------------------")
109 fmt.Println(totalAnswer)
110}