从新手到专家:Coze API调用Bot&工作流,会话隔离全攻略
摘要: 本文介绍了如何在扣子(Coze)平台上通过API实现用户会话隔离与交互功能。首先,通过OAuth授权生成JWT令牌,并进一步获取access_token以调用API。接着,详细讲解了如何创建会话、消息和对话,并通过API实现用户与智能体的交互。文章还讨论了如何在工作流节点中实现特殊交互,指出当前API暂不支持直接获取工作流节点信息,但可通过自定义规则间接识别节点状态。适合开发者参考,以实现

🎼个人主页:【Y小夜】
😎作者简介:一位双非学校的大三学生,编程爱好者,
专注于基础和实战分享,欢迎私信咨询!
🎆入门专栏:🎇【MySQL,Javaweb,Rust,python】
🎈热门专栏:🎊【Springboot,Redis,Springsecurity,Docker,AI】
感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持!❤️

目录
🎈基本背景
相信大家都或多或少了解过扣子平台,这里我就不做概念介绍了,emmmmm,那我这里就给大家先讲一下我这篇文章的简单概要吧。
1.提前工作:建设好一个bot,然后这个bot去调用一个工作流,并且需要这个bot已经发布了。
2.首先,我先给大家讲一下不同用户在调用不同对话如何实现之间的隔离,简单来说,是通过代码,生成一个JWT,再通过JWT生成一个 access_token,用户可以使用这个token调用bot。
3.其次,基于API实现创建会话、消息、对话。
4.第三,如何实现工作流节点的特殊交互。
🎈OAuth 授权:
详细参考:参考官方文档:扣子
提示:创建OAuth 应用只有管理员和超级管理员才能设置。
🎃建立应用:
首先打开,之后创建一个应用,

然后点击创建key,会得到一个公钥和一个私钥,私钥需要下载到本地。
🎃生成JWT:
首先我们调试一下代码(代码实例是官方的,改几个参数即可)
# You must run `pip install PyJWT cryptography` to install the PyJWT and the cryptography packages in order to use this script.
#!/usr/bin/env python3
import sys
import time
import uuid
import jwt
# 替换为你的实际 Coze App 私钥
signing_key = '''
-----BEGIN PRIVATE KEY-----
xxxxxxxxxxxxxxxxxx
-----END PRIVATE KEY-----
'''
payload = {
'iat': int(time.time()),
'exp': int(time.time()) + 600,
"jti": str(uuid.uuid4()),
'aud': 'api.coze.cn',
'iss': '1127900106117' # 替换为你的实际 Coze App ID
'session_name': '用户的唯一标识'
}
headers = {
'kid': '_v0VjcMlLdQc3tRTD3jC5Xz29TUnKQOhtuD5k-gpyf4' # 替换为你的实际 Coze App 公钥指纹
}
# Create JWT with headers
encoded_jwt = jwt.encode(payload, signing_key, algorithm='RS256', headers=headers)
print(f"JWT: {encoded_jwt}")
session_name参数很重要,虽然不是必填的,但是是用户的唯一标识,所以这里可以当作必填的。
运行代码后,然后就可以得到一个JWT了
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6InZZd2ZsdFR1OWZBbWtwWFhSdnR5UmREc3RONVMzZWNFcDFqVzB6dVQyRE****.eyJpc3MiOiIzMTAwMDAwMDAwMDIiLCJhdWQiOiJhcGkuY296ZS5jb20iLCJpYXQiOjE1MTYyMzkwMjIsImV4cCI6MTkxNjI1OTAyMiwianRpIjoiZmhqaGFsc2tqZmFkc2pld3F****.CuoiCCF-nHFyGmu2EKlwFoyd3uDyKQ3Drc1CrXQyMVySTzZlZd2M7zKWsziB3AktwbUZiRJlQ1HbghR05CW2YRHwKL4-dlJ4koR3onU7iQAO5DkPCaIxbAuTsQobtCAdkkZTg8gav9EnN1QN_1xq0w8BzuuhS7wCeY8UbaskkTK9GnO4eU9tEINmVw-2CrfB-kNbEHlEDwXfcrb4YPpkw3GhmuPShenNLObfSWS0CqIyakXL8qD5AgXLoB-SejAsRdzloSUInNXENJHfSVMkThxRhJy7yEjX3BmculC54fMKENRfLElBqwJyLLUjeRHsYnaru2ca4W8_yaPJ7F****
🎃生成token:
然后通过API调用,使用JWT令牌得到一个access_token(15分钟后过期),并且这个JWT令牌只能使用一次,想要产生新的token,就需要先生成新的JWT令牌。
curl --location --request POST 'https://api.coze.cn/api/permission/oauth2/token' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6InZZd2ZsdFR1OWZBbWtwWFhSdnR5UmREc3RONVMzZWNFcDFqVzB6dVQyRE****.eyJpc3MiOiIzMTAwMDAwMDAwMDIiLCJhdWQiOiJhcGkuY296ZS5jb20iLCJpYXQiOjE1MTYyMzkwMjIsImV4cCI6MTkxNjI1OTAyMiwianRpIjoiZmhqaGFsc2tqZmFkc2pld3F****.CuoiCCF-nHFyGmu2EKlwFoyd3uDyKQ3Drc1CrXQyMVySTzZlZd2M7zKWsziB3AktwbUZiRJlQ1HbghR05CW2YRHwKL4-dlJ4koR3onU7iQAO5DkPCaIxbAuTsQobtCAdkkZTg8gav9EnN1QN_1xq0w8BzuuhS7wCeY8UbaskkTK9GnO4eU9tEINmVw-2CrfB-kNbEHlEDwXfcrb4YPpkw3GhmuPShenNLObfSWS0CqIyakXL8qD5AgXLoB-SejAsRdzloSUInNXENJHfSVMkThxRhJy7yEjX3BmculC54fMKENRfLElBqwJyLLUjeRHsYnaru2ca4W8_yaPJ7F****' \
--data '{
"duration_seconds": 86399,
"grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer"
}'
返回实例:
{
"access_token": "czs_RQOhsc7vmUzK4bNgb7hn4wqOgRBYAO6xvpFHNbnl6RiQJX3cSXSguIhFDzgy****",
"expires_in": 1721135859
}
这样通过这个token, 我们就可以通过API调用扣子的接口了。
🎈创建基本的会话、消息、对话:
emmm,首先还是先用通俗易懂的话给大家讲一下他们三个的区别,防止打击搞混(因为我刚开始学的时候就搞混了)。
会话:简单来说,创建一个新的会话,就等于在使用智能体的时候,点击了一次+号,或者一个新的窗口,用户可以做上下文的交互。
消息:不管是用户,还是智能体,他们的每条,都称为消息
对话:用户与智能体的一次交互过程,简单来说就是一问一答。
一个会话中有很多对话,一个对话中有一条或多条消息。
🎃创建会话:
参考:扣子
接口:POST https://api.coze.cn/v1/conversation/create
入参:
| bot_id | string(这个地方尽量带着,后续查看会话列表的时候其实是必填的) | 会话对应的智能体 ID。(选择对应智能体的id) |
| meta_data | map(用户会话隔离也可以通过这种方式实现,如果实现用户之间的会话隔离,可以在这个地方传唯一id,然后,查各个用户会话的时候,在做过滤) | 创建消息时的附加消息,获取消息时也会返回此附加消息。 自定义键值对,应指定为 Map 对象格式。长度为 16 对键值对,其中键(key)的长度范围为 1~64 个字符,值(value)的长度范围为 1~512 个字符。 |
🎃查看会话列表:
入参:
| bot_id | String |
必填,智能体 ID,获取方法如下: |
调用语句:
curl -X GET 'https://api.coze.cn/v1/conversations?bot_id=7524906869631696923&' \
-H "Authorization: Bearer pat_hVSQtSDyoRsGamb8bpZvfglR75PoYBrPw5c21ZxblvpYJ0wuxX0TokM0yAU6AhDq" \
-H "Content-Type: application/json"
出参:
code : 0
msg : ""
data {2}
has_more : false
conversations {2}
0 {4}
meta_data {0}
last_section_id : 7527545081117835310
created_at : 1752643174
id : 7527545081117835310
1 {4}
created_at : 1752633629
id : 7527504098434990132
meta_data {1}
uuid : newid1234
last_section_id : 7527504098434990132
detail {1}
logid : 202507161419129B08A691FA22C5ACDB00
🎃创建消息:
创建一条消息,并将其添加到指定的会话中。消息在服务端的保存时长为 180 天,到期后自动删除。
参考:扣子
http拼接:
| conversation_id | String | 必填,Conversation ID,即会话的唯一标识。 |
入参:
| role | String |
必填,发送这条消息的实体。取值:
|
|
content_type |
String |
必填,消息内容的类型,支持设置为:
|
| content | String | 必填,消息的内容,支持纯文本、多模态(文本、图片、文件混合输入)、卡片等多种类型的内容。 |
🎃查看消息列表:
这个是关键:
- 查看消息列表 API 用于查询指定会话(conversation)中的消息记录,不仅包括开发者在会话中手动插入的每一条消息和用户发送的 Query,也包括调用发起对话 API 得到的 type=answer 的智能体回复,但不包括 type=function_call、tool_response 和 follow-up 类型的对话中间态消息。
- 查看对话消息详情 API 通常用于非流式对话场景中,查看某次对话(chat)中 type=answer 的智能体回复及 type=function_call、tool_response 和 follow-up 类型类型的对话中间态消息。不包括用户发送的 Query。
消息在服务端的保存时长为 180 天,期满后,消息将自动从会话的消息记录中删除。
|
|
入参:
| conversation_id | String | Conversation ID,即会话的唯一标识 |
出参:


🎃创建对话:
这里是我们每次调用的核心:
调用此接口发起一次对话,支持添加上下文和流式响应。
参考:扣子
http拼接:
| conversation_id | String |
标识对话发生在哪一次会话中。
|
入参:
|
bot_id |
String | 必填,要进行会话聊天的智能体 ID。(
确保当前使用的访问密钥已被授予智能体所属空间的 chat 权限。 ) |
| user_id | String(备注:似乎没什么用处) | 必填,标识当前与智能体对话的用户,由使用方自行定义、生成与维护。user_id 用于标识对话中的不同用户,不同的 user_id,其对话的上下文消息、数据库等对话记忆数据互相隔离。如果不需要用户数据隔离,可将此参数固定为一个任意字符串,例如 123,abc 等。 出于数据隐私及信息安全等方面的考虑,不建议使用业务系统中定义的用户 ID。 |
| stream | boolean |
是否流式返回,true:采用流式响应。false:(默认)采用非流式响应。 |
| additional_messages | array<obj>(这里基本是必填的,因为你要去用用户身份,问问题) |
对话的附加信息。你可以通过此字段传入历史消息和本次对话中用户的问题。数组长度限制为 100,即最多传入 100 条消息。
|
| auto_save_history | boolean | 是否保存本次对话记录。
|
| enable_card | 设置问答节点返回的内容是否为卡片形式。默认为 false。(但API调用的时候似乎没什么用) |
|
curl -X POST 'https://api.coze.cn/v3/chat?conversation_id=7527504098434990132&' \
-H "Authorization: 授权码" \
-H "Content-Type: application/json" \
-d '{
"workflow_id": "7524907732639678527",
"bot_id": "7524906869631696923",
"user_id": "123",
"stream": false,
"additional_messages": [
{
"role": "user",
"type": "question",
"content_type": "text",
"content": "你好"
}
]
}'
🎈 在工作流的某个节点的特殊交互
这里就是结论,给大家说出来:通过API调用Bot时,是无法获取到工作流 interrupt节点,因为data为空,询问客服,现阶段仅支持API调用异步或流式工作流打印工作流节点信息,可以通过envent_id恢复工作流,就可以得到节点信息,但是API调用bot暂不支持得到节点信息。建议对策:让某些我们需要的节点,去输出内部规定的一些规则,从而可以得到运行到哪个节点,然后做一些特殊逻辑的内部交互。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)