Interacting with API
几乎所有的网络应用程序都依赖于RESTful API。使大型语言模型(LLM)能够与它们交互,可以扩大其实际应用范围。
本教程展示了如何通过工具调用使用LLM进行API调用。
先决条件 - 示例事件管理服务器
我们将使用一个简单的事件管理服务器,并展示如何与之交互。
/// 译文内容:
---
根据上面的信息,执行如下指令:
缺失译文,请检查输入
const express = require('express');;
const { v4: uuidv4 } = require('uuid');;
const app = express();;
const PORT = process.env.PORT || 5566;;
// 中间件
app.use(express.json());;
// 模拟数据库 - 内存存储
let events = [
{
id: '1',,
名称:'2024年科技大会',
日期:'2024-06-15T09:00:00Z',
地点:加利福尼亚州旧金山
},
{
id: '2',,
名称:'音乐节',
日期:'2024-07-20T18:00:00Z',
地点:'德克萨斯州奥斯汀'
},
{
id: '3',,
名称:'艺术展开幕',
日期:'2024-05-10T14:00:00Z',
地点:纽约州纽约市
},
{
id: '4',,
名称:'创业交流活动',
日期:'2024-08-05T17:30:00Z',
地点:'华盛顿州西雅图'
},
{
id: '5',,
名称:'美食与美酒品鉴',
日期:'2024-09-12T19:00:00Z',
地点:'加利福尼亚州纳帕谷'
}
];
// 用于验证事件数据的辅助函数
const 验证事件 = (事件数据) => {
const 必填项 = ['姓名', '日期', '地点'];;
const 缺失项 = required.filter(field => !eventData[field]);;
如果 (missing.length > 0) {
返回 { valid: false, message: `缺少必填字段:${missing.join(', ')}` };;
}
// 基本日期验证
常量 `dateRegex` 定义了一个正则表达式,用于匹配符合特定格式的日期时间字符串。该格式为:`yyyy-mm-ddThh:mm:ss[.ns]Z`,其中 `yyyy` 表示年份,`mm` 表示月份,`dd` 表示日期,`hh` 表示小时,`mm` 表示分钟,`ss` 表示秒,`ns` 表示纳秒(可选),`Z` 表示时区(可选);
如果 (!dateRegex.test(eventData.date)) {
返回 { valid: false, message: '日期必须采用 ISO 8601 格式(YYYY-MM-DDTHH:mm:ssZ)' };;
}
返回 { valid: true };;
};
// GET /events - 列出所有事件
app.get('/events', (req, res) => {
res.status(200).json(events);;
});
// POST /events - 创建一个新事件
app.post('/events', (req, res) => {
const 验证结果 = 验证事件(req.body);;
如果 (!validation.valid) {
返回状态码400,并返回JSON格式的数据,其中包含错误信息:validation.message;
}
const newEvent = {
id: req.body.id || uuidv4(),,
名称:req.body.name,
日期:req.body.date,
位置:req.body.location
};
将新事件(newEvent)推入事件列表(events);
res.status(201).json(newEvent);;
});
// GET /events/{id} - 根据ID检索事件
app.get('/events/:id', (req, res) => {
const event = events.find(e => e.id === req.params.id);;
如果 (!event) {
返回状态码404,并返回JSON格式的数据,数据中包含错误信息“未找到事件”;
}
响应状态码为200,返回JSON格式的事件数据;
});
// DELETE /events/{id} - 根据ID删除事件
app.delete('/events/:id', (req, res) => {
const eventIndex = events.findIndex(e => e.id === req.params.id);;
如果 (eventIndex === -1) {
返回状态码404,并返回JSON格式的数据,其中包含错误信息“事件未找到”;
}
events.splice(eventIndex, 1);;
响应状态码为204,发送响应;
});
// PATCH /events/{id} - 根据ID更新事件的详细信息
app.patch('/events/:id', (req, res) => {
const eventIndex = events.findIndex(e => e.id === req.params.id);;
如果 (eventIndex === -1) {
返回状态码404,并返回JSON格式的数据,其中包含错误信息“未找到事件”;
}
const 验证结果 = 验证事件(req.body);;
如果 (!validation.valid) {
返回响应状态码400,并返回JSON格式的数据,其中包含错误信息:validation.message;
}
// 更新事件
events[eventIndex] = {
...events[eventIndex],
名称:req.body.name,
日期:req.body.date,
位置:req.body.location
};
响应状态码为200,返回JSON格式的事件数据(events[eventIndex]);
});
// 错误处理中间件
app.use((err, req, res, next) => {
console.error(err.stack);;
响应状态码为500,JSON格式返回错误信息:{ error: '出错了!' };
});
// 404 错误处理程序
应用使用((请求, 响应) => {
响应状态码为404,JSON格式的错误信息为:{ error: 'Endpoint not found' };
});
// 启动服务器
app.listen(PORT, () => {
console.log(`事件管理API服务器正在端口${PORT}上运行`);;
控制台输出(`Available endpoints:`);;
console.log(` GET /events - 列出所有事件`);;
控制台输出:`POST /events - 创建一个新事件`;
console.log(` GET /events/{id} - 根据ID获取事件`);;
console.log(` PATCH /events/{id} - 根据ID更新事件`);;
console.log(` DELETE /events/{id} - 根据ID删除事件`);;
});
module.exports = app;;请求工具
有四种请求工具可供使用。这使得LLM能够在必要时调用GET、POST、PUT、DELETE工具。
步骤1:添加起始节点
开始节点是流程的入口点

步骤2:添加智能体节点
接下来,添加一个智能体节点。在此设置中,代理配置了四种主要工具:GET、POST、PUT和DELETE。每种工具都设置为执行特定类型的API请求。
工具1:GET(检索事件)

**目的:**从API获取事件列表或特定事件。
配置输入:
URL:
http://localhost:5566/events名称:
get_events描述: 描述何时使用此工具。例如:“当您需要获取事件时,请使用此工具。”
头信息:(可选)添加任何所需的HTTP头信息。。
查询参数模式(Query Params Schema):API的JSON模式,使大型语言模型(LLM)能够了解URL结构,以及生成哪些路径和查询参数。例如:
{ "id": { "type": "字符串",, "in": "path",, "description": "要获取的物品的ID。/:id" }, "limit": { "type": "字符串",, "in": "query",, "description": "限制获取的项目数量。?limit=10" } }
工具2:POST(创建事件)

**目的:**在系统中创建一个新事件。
配置输入:
URL:
http://localhost:5566/events名称:
create_event描述:
当您想要创建新事件时,请使用此选项。头信息:(可选)添加任何所需的HTTP头信息。
Body:硬编码的主体对象,将覆盖由大型语言模型(LLM)生成的主体 Body Schema:API请求体的JSON模式,它使LLM(大型语言模型)知道如何自动生成正确的JSON请求体。例如:
{ "name": { "type": "字符串",, “required”:true, "description": "事件名称" }, "date": { "type": "字符串",, “required”:true, "description": "活动日期" }, "location": { "type": "字符串",, “required”:true, “description”:“事件地点” } }
工具3:PUT(更新事件)

**目的:**更新现有活动的详细信息。
配置输入:
URL:
http://localhost:5566/events名称:
update_event描述:
当您想要更新事件时,请使用此功能。头信息:(可选)添加任何所需的HTTP头信息。
Body:硬编码的主体对象,将覆盖由大型语言模型(LLM)生成的主体 Body Schema:API请求体的JSON模式,它使LLM能够知道如何自动生成正确的JSON请求体。例如:
{ "name": { "type": "字符串",, “required”:true, "description": "事件名称" }, "date": { "type": "字符串",, “required”:true, "description": "活动日期" }, "location": { "type": "字符串",, “required”:true, "description": "活动地点" } }
工具4:删除(删除事件)

**目的:**从系统中移除一个事件。
配置输入:
URL:
http://localhost:5566/events名称:
delete_event说明:
当您需要删除事件时,请使用此功能。头信息:(可选)添加任何所需的HTTP头信息。。
查询参数模式(Query Params Schema):API的JSON模式,使大型语言模型(LLM)能够了解URL结构,以及应生成哪些路径和查询参数。例如:
{ "id": { "type": "字符串",, “required”:true, "in": "path",, "description": "要删除的项目的ID。/:id" } }
智能体如何使用这些工具
智能体可以根据用户的请求或流程的逻辑动态选择要使用的工具。
每个工具都对应特定的HTTP方法和端点,并具有明确定义的输入模式。
智能体利用大型语言模型(LLM)来解释用户输入,填写所需参数,并发出适当的API调用。
当然!以下是一些交互示例,供您参考,包括示例用户查询以及每种查询对应的预期行为,这些行为与相应的工具(GET、POST、PUT、DELETE)相关联:
交互示例
1. 检索事件(GET)
示例查询:
“显示所有即将发生的事件。”
预期行为:
智能体选择GET工具。
它向
http://localhost:5566/events发送一个GET请求。智能体向用户返回所有事件的列表。
示例查询:
“获取ID为12345的事件详情。”
预期行为:
智能体选择GET工具。
它向
http://localhost:5566/events/12345发送一个GET请求。智能体返回了ID为“12345”的事件的详细信息。
2. 创建新事件(POST)
示例查询:
“在2024年7月15日于科技厅举办一场名为‘AI大会’的新活动。”
预期行为:
智能体选择POST工具。
它向
http://localhost:5566/events发送一个POST请求,请求体内容如下:{ "name": "人工智能会议",, "日期":"2024-07-15", "位置":"技术大厅" }智能体确认事件已创建,并可能返回新事件的详细信息。
3. 更新事件(PUT)
示例查询:
“将2024年7月15日‘AI大会’的举办地点更改为‘主礼堂’。”
预期行为:
智能体选择PUT工具。
它向
http://localhost:5566/events发送一个带有更新后事件详细信息的PUT请求:{ "name": "人工智能会议",, "日期":"2024-07-15", “地点”:“主礼堂” }智能体确认事件已更新。
4. 删除事件(DELETE)
示例查询:
“删除ID为12345的事件。”
预期行为:
智能体选择 DELETE 工具。
它向
http://localhost:5566/events/12345发送一个DELETE请求。智能体确认事件已删除。
完整流程
{"request": "GET /api/v1/users", "response": "200 OK"}OpenAPI工具包
如果你只有几个API,那么这4个请求工具就非常好用,但想象一下,如果有数十个甚至数百个API,维护起来就会变得很困难。为了解决这个问题,Flowise提供了一个OpenAPI工具包,该工具包能够接收一个OpenAPI YAML文件,并将每个API解析为一个工具。OpenAPI规范(OAS)是一种普遍接受的标准,用于以机器可读取和解释的格式描述RESTful API的详细信息。
使用事件管理API,我们可以生成一个OpenAPI YAML文件:
/// 译文内容:
---
根据上面的信息,执行如下指令:
你是个专业的翻译,负责把英语内容翻译成中文内容,请帮我翻译一下原文内容
openapi: 3.0.0
信息:
版本:1.0.0
标题:事件管理API
描述:用于管理事件数据的API
服务器:
- 网址:http://localhost:5566
描述:本地开发服务器
路径:
/events:
获取:
摘要:列出所有事件
操作ID:listEvents
响应:
'200':
描述:事件列表
内容:
application/json:
模式:
类型:数组
项目:
$ref: '#/components/schemas/Event'
帖子:
摘要:创建新事件
操作ID:createEvent
请求正文:
必需:是
内容:
application/json:
模式:
$ref: '#/组件/模式/事件输入'
响应:
'201':
描述:该事件已创建
内容:
application/json:
模式:
$ref: '#/组件/模式/事件'
'400':
描述:输入无效
内容:
application/json:
模式:
$ref: '#/components/schemas/Error'
/events/{id}:
参数:
- 名称:id
在:路径
必需:是
模式:
类型:字符串
描述:事件ID
获取:
摘要:根据ID检索事件
操作ID:getEventById
响应:
'200':
描述:该事件
内容:
application/json:
模式:
$ref: '#/组件/模式/事件'
'404':
描述:未找到事件
内容:
application/json:
模式:
$ref: '#/components/schemas/Error'
补丁:
摘要:根据ID更新事件的详细信息
操作ID:updateEventDetails
请求正文:
必需:是
内容:
application/json:
模式:
$ref: '#/组件/模式/事件输入'
响应:
'200':
描述:活动的详细信息已更新
内容:
application/json:
模式:
$ref: '#/组件/模式/事件'
'400':
描述:输入无效
内容:
application/json:
模式:
$ref: '#/components/schemas/Error'
'404':
描述:未找到事件
内容:
application/json:
模式:
$ref: '#/组件/模式/错误'
删除:
摘要:按ID删除事件
操作ID:删除事件
响应:
'204':
描述:该事件已被删除
'404':
描述:未找到事件
内容:
application/json:
模式:
$ref: '#/组件/模式/错误'
组件:
模式:
事件:
类型:对象
属性:
id:
类型:字符串
描述:事件的唯一标识符
名称:
类型:字符串
描述:事件的名称
日期:
类型:字符串
格式:日期-时间
描述:以ISO 8601格式表示的事件日期和时间
位置:
类型:字符串
描述:活动地点
所需:
- 名称
- 日期
- 位置
事件输入:
类型:对象
属性:
名称:
类型:字符串
描述:事件的名称
日期:
类型:字符串
格式:日期-时间
描述:以ISO 8601格式表示的事件日期和时间
位置:
类型:字符串
描述:活动地点
要求:
- 名称
- 日期
- 位置
错误:
类型:对象
属性:
错误:
类型:字符串
描述:错误信息步骤1:添加起始节点

步骤2:添加智能体节点
接下来,添加一个智能体节点。在此设置中,智能体仅配置了一个工具——OpenAPI Toolkit
工具:OpenAPI Toolkit

**目的:**从YAML文件中获取API列表,并将每个API转换为工具列表
配置输入:
**YAML文件:**OpenAPI的YAML文件
直接返回:是否直接从API返回响应
头信息:(可选)添加任何所需的HTTP头信息。。
移除空参数:从解析后的参数中移除所有值为空的键
自定义代码:自定义返回响应的方式
交互示例:
我们可以使用之前示例中的相同示例查询来对其进行测试:

按顺序调用API
从上面的示例中,我们已经看到了智能体如何动态调用工具并与API进行交互。在某些情况下,可能需要在某些操作之前或之后按顺序调用API。例如,您可能会从CRM中获取客户列表并将其传递给智能体。在这种情况下,您可以使用HTTP节点。

最佳实践
与应用程序编程接口(API)交互通常用于希望智能体获取最新信息的情况。例如,智能体可能会检索您的日历可用性、项目状态或其他实时数据。
在系统提示中明确包含当前时间通常很有帮助。Flowise提供了一个名为
{{current_date_time}}的变量,用于检索当前日期和时间。这使得大型语言模型(LLM)能够感知当前时刻,因此,如果你询问自己今天的可用性,模型可以引用正确的日期。否则,它可能会依赖其最后一次训练的截止日期,这将返回过时的信息。例如:
你是个得力的助手。
今天的日期时间是{{current_date_time }}Last updated