前言
由于dify
只提供了一个分享用的网页应用,网页访问地址没法自定义,虽然可以接入NextWeb/ChatGPT web/open webui
等开源应用。但是如果我们想直接给客户应用,还需要客户去设置配置,里面还有很多我们不想展示给客户的东西怎么办?于是,我使用Chainlit
实现了一个无缝快速接入dify
实现自定义用户使用界面的应用,代码清晰简单。还可以自定义logo、欢迎语、网站图标、语言输入、语音设别、文件上传等。
快速开始
获取dify的base_url和api_key
Dify
官网地址 https://dify.ai/zh
登录Dify
后台,在工作室里,选择一个你创建的应用,点击进入。
点击访问 API,点击API 密匙,创建一个,访问API
的KEY
. 复制服务器地址,后面需要配置到Chainlit
的环境变量中
复制API密匙,后面需要配置到Chainlit
的环境变量中
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
在项目根目录下创建app.py文件,代码如下:
import os
import aiohttp
import chainlit as cl
import json
import requests
dify_base_url = os.environ["DIFY_BASE_URL"]
dify_api_key = os.environ["DIFY_API_KEY"]
@cl.on_chat_start
def start_chat():
cl.user_session.set("message_history", [])
@cl.on_message
async def main(message: cl.Message):
message_history = cl.user_session.get("message_history")
message_history = message_history[-8:]
message_history.append({"role": "user", "content": message.content, "content_type": "text"})
msg = cl.Message(content="")
url = f"{dify_base_url}/chat-messages"
headers = {
"Authorization": f"Bearer {dify_api_key}",
"Content-Type": "application/json"
}
print(headers)
data = {
"inputs": {},
"query": message.content,
"user": "tarzan",
"conversation_id": "",
"response_mode": "streaming",
"files": []
}
async for delta in fetch_sse(url, headers=headers, data=json.dumps(data)):
task_id = delta.get("task_id", '')
cl.user_session.set("task_id",task_id)
await msg.stream_token(delta.get("answer", ''))
await msg.send()
# message_history.append({"role": "assistant", "type": "answer", "content": msg.content, "content_type": "text"})
@cl.on_stop
def on_stop():
print("The user wants to stop the task!")
task_id = cl.user_session.get("task_id")
print('task_id-------', task_id)
if task_id:
url = f"{dify_base_url}/chat-messages/{task_id}/stop"
print('url', url)
headers = {
"Authorization": f"Bearer {dify_api_key}",
"Content-Type": "application/json"
}
print(headers)
data = {"user": "tarzan"}
with requests.post(
url,
headers=headers,
data=data,
) as resp:
print('resp',resp.content)
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: {line}")
# 检查是否为事件类型行
if data.startswith('data:'):
data = data.split(':', 1)[1].strip() # 提取数据内容
# 如果数据包含换行符,可能需要进一步处理(这取决于你的具体需求)
# 这里我们简单地打印出来
# print(f"Received data for event 'conversation.message.delta': {data}")
yield json.loads(data)
在项目根目录下创建.env
环境变量,配置如下:
DIFY_BASE_URL="https://api.dify.ai/v1"
DIFY_API_KEY="app-key"
- 如何是私有化部署,DIFY_BASE_URL替换成你私有化服务器的地址
DIFY_API_KEY
替换成你自己的API 密匙
执行以下命令安装依赖:
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 可以整理整合开源语音识别、语音播放、文件上传管理等功能
- 本代码只整合了dify api的对话接口,后续可以接入文件图片上传的接口、历史会话记录等。
相关文章推荐
《Chainlit快速实现AI对话应用的界面定制化教程》
《Chainlit接入FastGpt接口快速实现自定义用户聊天界面》
《使用 Xinference 部署本地模型》
《Fastgpt接入Whisper本地模型实现语音输入》
《Fastgpt部署和接入使用重排模型bge-reranker》
《Fastgpt部署接入 M3E和chatglm2-m3e文本向量模型》
《Fastgpt 无法启动或启动后无法正常使用的讨论(启动失败、用户未注册等问题这里)》
《vllm推理服务兼容openai服务API》
《vLLM模型推理引擎参数大全》
《解决vllm推理框架内在开启多显卡时报错问题》
《Ollama 在本地快速部署大型语言模型,可进行定制并创建属于您自己的模型》