dify的web页面如何传入user用户信息进行对话,而不是uuid

问题

因为dify中应用的发布页面默认是不能传入user参数的,而是进入web页面时,前端自动向后端注册passport,后端会将一个end_user_id(uuid)返回到前端页面并保存下来,于是每次与机器人问答时都会将该end_user_id通过JWT编码发送到后端,我们在后台所看到的聊天的用户就是一个uuid了。

尝试1

要想修改这个user_id,一开始使用修改后端的方法,在前端强行传入一个user_id到后端,后端接收参数并参考API调用方式,调用EndUserService.get_or_create_end_user_by_type()方法使用我们给的user_id创建一个enduser开始对话。

文件:api/controllers/web/completion.py

但是碰到了一个问题,就是这个创建出来的enduser没有绑定到对应的conversation_id,因为这个conversation_id是绑定到了JWT Token中解码出来的enduser_id上,导致前端页面一直报错,虽然强行也能用,后台也能显示用户是设置的user_id。

尝试2

于是通过AI分析dify的代码,发现其实前端是有一个方法可以传递参数的,就是在web/app/components/base/chat/utils.ts文件中的getProcessedSystemVariablesFromUrlParams()函数。

当我们在前端页面的url中添加sys.user参数时,该函数就能获取到该参数并加入到系统变量中。

但是一开始我们改完之后没有生效,原来是这个user_id是需要编码的,代码如下:

python 复制代码
import gzip
import base64

def encode_user_id(user_id):
    text = user_id.encode('utf-8')
    compressed = gzip.compress(text)
    base64_encoded = base64.b64encode(compressed).decode('utf-8')
    return base64_encoded

user_id = '1111'
encoded = encode_user_id(user_id)
print(f'Original user_id: {user_id}')
print(f'Encoded user_id: {encoded}')
print()
print('URL example:')
print(f'https://my-host:port/chat/zcafASFASDASDAD?sys.user_id={encoded}')

user_id是需要gzip和base64编码才能够生效。

当添加该参数后就能够在应用后台观察到对话的用户已经变成我们传入的user_id了。

注意

当在url后添加完参数后还需要清理浏览器的本地存储,将之前保存的聊天记录和用户信息全部删除,这样才会生效。

相关推荐
程序员爱钓鱼4 分钟前
Rust String 与 &str 详解:字符串所有权、借用与转换
前端·后端·rust
大模型任我行6 分钟前
阿里:端到端文档解析模型OvisOCR2
人工智能·语言模型·自然语言处理·论文笔记
aixingkong9218 分钟前
Atlas 950 1024卡SuperPoD推测分析
网络·人工智能·硬件架构·硬件工程
码农学院9 分钟前
GEO与SEO协同:从传统搜索到生成式搜索的平滑迁移路径
服务器·前端·python
触底反弹9 分钟前
🤯 面试被问 AI Workflow 和 Agent 有啥区别?3 张图 + 2 段代码讲清楚!
人工智能·设计模式·面试
步步精BBJconn12 分钟前
从GPU服务器到数据中心:AI服务器高压连接器的应用与发展趋势
大数据·运维·服务器·人工智能·科技·物联网
K姐研究社18 分钟前
Codex 怎么用国产模型?Kimi + CC Switch 接入配置指南
人工智能·aigc
GuWenyue7 小时前
写Agent还要重复封装工具?一套MCP多服务方案,3个能力让AI自动查地图、读写文件、操控浏览器
人工智能·机器学习·开源
GuWenyue7 小时前
90%AI新手不会调参!LangChain双模型流水线实战,一套代码兼顾严谨+创意
人工智能
咩咩啃树皮8 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构