应用调用
更新时间:2024-12-11
AppBuilderClient组件
简介
AppBuilderClient组件支持调用在百度智能云千帆AppBuilder 平台上通过AppBuilderClient构建并发布的智能体应用。
功能介绍
具体包括创建会话、上传文档、运行对话等
特色优势
与云端Console 应用能力打通,实现低代码会话
应用场景
快速、高效集成云端已发布智能体应用能力
基本用法
Python
组件初始化参数
参数名称 | 参数类型 | 描述 | 示例值 |
---|---|---|---|
app_id | string | 线上Agent应用的ID | "正确的应用ID" |
Run方法入参
参数名称 | 参数类型 | 是否必须 | 描述 | 示例值 |
---|---|---|---|---|
conversation_id | String | 是 | 会话ID | |
query | String | 否 | query问题内容 | "今天天气怎么样?" |
file_ids | list[String] | 否 | 对话可引用的文档ID | |
stream | Bool | 否 | 为true时则流式返回,为false时则一次性返回所有内容, 推荐设为true,降低首token时延 | False |
Run方法非流式返回
参数名称 | 参数类型 | 描述 | 示例值 |
---|---|---|---|
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等的详细输出内容 |
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
组件初始化参数
参数名称 | 参数类型 | 描述 | 示例值 |
---|---|---|---|
appID | String | 线上Agent应用的ID | "正确的应用ID" |
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等的详细输出内容 |
示例代码
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}
Go
组件初始化参数
参数名称 | 参数类型 | 描述 | 示例值 |
---|---|---|---|
app_id | string | 线上Agent应用的ID | "正确的应用ID" |
config | SDKConfig | SDK配置信息 |
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等的详细输出内容 |
示例代码
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 // 所上传文件仅在本次会话ID下发生作用,如果创建新的会话ID,上传的文件自动失效
37 // 而知识库在不同的会话ID下均有效
38 fileID, err := builder.UploadLocalFile(conversationID, "/path/to/cv.pdf")
39 if err != nil {
40 fmt.Println("upload local file failed:", err)
41 return
42 }
43 // 执行流式对话
44 // 注意file_ids不是必填项,如果不需要引用特定的文档,则将[]string{fileID}更换为nil即可
45 // 同时还需要将上文的fileID, err := builder.UploadLocalFile(conversationID, "/path/to/cv.pdf")代码
46 // 更换为 _, err = client.UploadLocalFile(conversationID, "/path/to/cv.pdf"),否则会报错
47 i, err := builder.Run(conversationID, "描述简历中的候选人情况", []string{fileID}, true)
48 if err != nil {
49 fmt.Println("run failed: ", err)
50 return
51 }
52
53 completedAnswer := ""
54 var answer *appbuilder.AppBuilderClientAnswer
55 for answer, err = i.Next(); err == nil; answer, err = i.Next() {
56 completedAnswer = completedAnswer + answer.Answer
57 for _, ev := range answer.Events {
58 if ev.ContentType == appbuilder.TextContentType {
59 detail := ev.Detail.(appbuilder.TextDetail)
60 fmt.Println(detail.Text)
61 } else if ev.ContentType == appbuilder.CodeContentType {
62 detail := ev.Detail.(appbuilder.CodeDetail)
63 fmt.Println(detail.Code)
64 } else if ev.ContentType == appbuilder.ImageContentType {
65 detail := ev.Detail.(appbuilder.ImageDetail)
66 fmt.Println(detail.Image)
67 } else if ev.ContentType == appbuilder.RAGContentType {
68 detail := ev.Detail.(appbuilder.RAGDetail)
69 if len(detail.References) > 0 {
70 fmt.Println(detail.References)
71 }
72 } else if ev.ContentType == appbuilder.FunctionCallContentType {
73 detail := ev.Detail.(appbuilder.FunctionCallDetail)
74 fmt.Println(detail)
75 } else if ev.ContentType == appbuilder.AudioContentType {
76 detail := ev.Detail.(appbuilder.AudioDetail)
77 fmt.Println(detail.Audio)
78 } else if ev.ContentType == appbuilder.VideoContentType {
79 detail := ev.Detail.(appbuilder.VideoDetail)
80 fmt.Println(detail)
81 } else if ev.ContentType == appbuilder.StatusContentType {
82 } else { // 默认detail
83 detail := ev.Detail.(appbuilder.DefaultDetail)
84 fmt.Println(detail)
85 }
86 }
87 }
88 // 迭代正常结束err应为io.EOF
89 if errors.Is(err, io.EOF) {
90 fmt.Println("run success")
91 fmt.Println("智能体回答内容: ", completedAnswer)
92 } else {
93 fmt.Println("run failed:", err)
94 }
95}