前言
由于Coze 只提供了一个分享用的网页应用,网页访问地址没法自定义,虽然可以接入NextWeb/ChatGPT web/open webui等开源应用。但是如果我们想直接给客户应用,还需要客户去设置配置,里面还有很多我们不想展示给客户的东西怎么办?于是,我使用Chainlit实现了一个无缝快速接入Coze 实现自定义用户使用界面的应用,代码清晰简单。还可以自定义logo、欢迎语、网站图标、语言输入、语音设别、文件上传等。
Coze国内版可以免费使用 豆包模型、通义千问 qwen-max , 智谱 GLM-4 128K 、MiniMax 、月之暗面(kimi)、百川智能等llm大模型。这些在他们各自平台上都是收费使用,大约都在0.2元/1000 tokens左右,能免费使用真的太香了!
快速开始
创建扣子Bot
在团队空间里,创建扣子Bot,并配置链接、图片和文档识别等技能插件
获取coze 的base_url和api_key
coze 国际官网地址 coze.com/
coze 国内官网地址 coze.cn/
登录Coze 后台,在团队空间里,创建的AI应用,创建完毕后点击进入。
- 注意 一定要团队空间里创建,个人空间创建的ai影响,无法通过API访问。
点击发布按钮,进入发布界面。
勾选,Bot as API,然后点击配置,进入配置界面。
创建个人访问令牌,拿到令牌token,后面需要配置到环境变量配置文件中。
最后,返回到发布页面,点击右上角的,发布按钮。每次发布都需要审核,首次发布后,需要等带审核完毕后,才能通过API访问。
chainlit网页搭建
创建一个文件,例如“chainlit_chat”
mkdir chainlit_chat
进入 chainlit_chat文件夹下,执行命令创建python 虚拟环境空间(需要提前安装好python sdk。 Chainlit 需要python>=3.8。,具体操作,由于文章长度问题就不在叙述,自行百度),命令如下:
python -m venv .venv
- 这一步是避免python第三方库冲突,省事版可以跳过
.venv是创建的虚拟空间文件夹可以自定义
接下来激活你创建虚拟空间,命令如下:
#linux or mac
source .venv/bin/activate
#windows
.venv\Scripts\activate
在项目根目录下创建requirements.txt,内容如下:
chainlit~=1.1.306
aiohttp
在项目根目录下创建app.py文件,代码如下:
import os
import aiohttp
import chainlit as cl
import json
import requests
coze_bot_id = os.environ["COZE_BOT_ID"]
coze_api_key = os.environ["COZE_API_KEY"]
def file_upload(file_path):
# 设置请求头
headers = {
"Authorization": f"Bearer {coze_api_key}"
}
# 打开文件以二进制模式读取
with open(file_path, 'rb') as f:
# 文件字典
files = {
'file': (file_path, f),
}
# 发送POST请求
response = requests.post("https://api.coze.cn/v1/files/upload", headers=headers, files=files)
# 检查响应状态码
if response.status_code == 200:
if response.json()['code'] == 0:
print(response.json())
data = response.json()['data']
return data['id']
print(f'文件上传失败: {response.json()}')
return None
@cl.on_chat_start
async def start_chat():
welcomeText = "你好,我是泰山AI智能客服,有什么可以帮助您吗?"
await cl.Message(content=welcomeText).send()
@cl.on_message
async def main(message: cl.Message):
msg = cl.Message(content="")
multi_content = []
if len(message.elements) > 0:
elements = message.elements[:3]
for element in elements:
file_id = file_upload(element.path)
if file_id:
print('file_id', file_id)
element_type = 'file'
if "image" in element.mime:
element_type = 'image'
multi_content.append({
"type": element_type,
"file_id": file_id,
})
multi_message = [{"type": "text", "text": message.content}, *multi_content]
# 将 multi_message 转换成字符串
multi_message_str = json.dumps(multi_message, ensure_ascii=False)
coze_message = [{
"role": "user",
"content": f'{multi_message_str}',
"content_type": "object_string"
}]
url = "https://api.coze.cn/v3/chat"
headers = {
"Authorization": f"Bearer {coze_api_key}",
"Content-Type": "application/json"
}
data = {
"bot_id": coze_bot_id,
"user_id": cl.context.session.id,
"stream": True,
"auto_save_history": True,
"additional_messages": coze_message
}
async for delta in fetch_sse(url, headers=headers, data=json.dumps(data)):
await msg.stream_token(delta['content'])
await msg.send()
async def fetch_sse(url, headers, data):
async with aiohttp.ClientSession() as session:
async with session.post(url, headers=headers, data=data) as response:
async for line in response.content:
if line: # 过滤掉空行
data = line.decode('utf-8').rstrip('\n\r')
print(f"Received: {data}")
# 检查是否为事件类型行
if data.startswith('event:'):
event_type = data.split(':', 1)[1].strip() # 提取事件类型
# 检查是否为数据行,并且是我们感兴趣的事件类型
elif data.startswith('data:') and event_type == 'conversation.message.delta':
data = data.split(':', 1)[1].strip() # 提取数据内容
# 如果数据包含换行符,可能需要进一步处理(这取决于你的具体需求)
# 这里我们简单地打印出来
# print(f"Received data for event 'conversation.message.delta': {data}")
yield json.loads(data)
- coze api文档地址 www.coze.cn/docs/develo…
在项目根目录下创建.env环境变量,配置如下:
COZE_BOT_ID="7361599102180065321"
COZE_API_KEY="pat_key"
- 如何是私有化部署,COZE_BOT_ID 替换成你创建应用的bot_id
bot_id:Bot ID。进入 Bot 的开发页面,开发页面 URL中 bot 参数后的数字就是 Bot ID。例如**www.coze.cn/space/341**… ID 为73428668*****。**COZE_API_KEY替换成你自己创建的个人访问令牌密匙
执行以下命令安装依赖:
pip install -r .\requirements.txt
- 安装后,项目根目录下会多出
.chainlit和.files文件夹和chainlit.md文件
运行应用程序
要启动 Chainlit 应用程序,请打开终端并导航到包含的目录app.py。然后运行以下命令:
chainlit run app.py -w
- 该
-w标志告知Chainlit启用自动重新加载,因此您无需在每次更改应用程序时重新启动服务器。您的聊天机器人 UI 现在应该可以通过http://localhost:8000访问。 - 自定义端口可以追加
--port 80
对话效果图片示例:
- chainlit 可以实现聊天的界面的完全自定义
- chainlit 可以整理整合开源语音识别、语音播放、文件上传管理等功能
- 本代码只整合了coze api的对话接口,后续可以接入文件图片上传的接口、历史会话记录等。
- 当前扣子 API 免费供开发者使用,发起对话 API 的请求频率限制如下:
- QPS(每秒发送的请求数):2
- QPM(每分钟发送的请求数):60
- QPD(每天发送的请求数):3000
相关文章推荐
《Chainlit快速实现AI对话应用的界面定制化教程》 《Chainlit接入DifyAI知识库接口快速实现自定义用户聊天界面》 《Chainlit接入FastGpt接口快速实现自定义用户聊天界面》 《使用 Xinference 部署本地模型》 《Fastgpt接入Whisper本地模型实现语音输入》 《Fastgpt部署和接入使用重排模型bge-reranker》 《Fastgpt部署接入 M3E和chatglm2-m3e文本向量模型》 《Fastgpt 无法启动或启动后无法正常使用的讨论(启动失败、用户未注册等问题这里)》 《vllm推理服务兼容openai服务API》 《vLLM模型推理引擎参数大全》 《解决vllm推理框架内在开启多显卡时报错问题》 《Ollama 在本地快速部署大型语言模型,可进行定制并创建属于您自己的模型》