写在前面的话
你不爱我。昨天,去翡翠图书馆,下午大宝打来视频,刚接通,看我在翡翠就挂了。一会后,骑自行车来找我了,我住的地方离翡翠图书馆也就几百米,所以,大宝来得很快。大宝刚坐下不到五分钟,说渴了,要喝饮料,这也是他的一惯操作,每次来找我,指定要到旁边的物美超市买点东西。我说,你妈老说我乱花钱,你给你妈说说。大宝给媳妇打电话,得到允许后,我就带他去物美了,买了雪糕与饮料,就回图书馆,给他找了耳机,他就坐我旁边看手机,越看身体越不像样,最后,把脚敲到我座位的把手上,鞋底很脏,蹬着我的衣服。我说,你把脚放下去。他看了我一眼,摇了摇头。我一把把他的脚拍下去,他身体一晃,抖了一下。之后,就坐旁边其它地方了。我看他情绪不对,就过去安慰他,他说,你不爱你。我说,爸爸爱你,但不会宠你,你自己品吧。
[327]-------->底部有张生活照片和昨日花销
【关键词】python、删除会话、websocket、客户端发消息、
一、chat_serve相关
1.删除会话接口
描述:需要写一个删除会话接口,传一个会话id就可以。
开工:
第一步:分析原接口
a.找原接口地址
http://localhost:9222/v1/conversation/rm
注:是post请求,传参数如下:
图7a-1
注:这个接口设计的是一个用户下的多个会话删除,接下来,研究下源码。
b.ragflow源码研究
20241210时间段:2330-2340
源码如下:
@manager.route('/rm', methods=['POST'])
@login_required
def rm():
conv_ids = request.json["conversation_ids"]
try:
for cid in conv_ids:
exist, conv = ConversationService.get_by_id(cid)
if not exist:
return get_data_error_result(retmsg="Conversation not found!")
tenants = UserTenantService.query(user_id=current_user.id)
for tenant in tenants:
if DialogService.query(tenant_id=tenant.tenant_id, id=conv.dialog_id):
break
else:
return get_json_result(
data=False, retmsg=f'Only owner of conversation authorized for this operation.',
retcode=RetCode.OPERATING_ERROR)
ConversationService.delete_by_id(cid)
return get_json_result(data=True)
except Exception as e:
return server_error_response(e)注:不用看直接干过去调一下。
c.chat_sev调代码
20241210时间段:2332-2340
对上述删除会话代码,进行调试,修改代码如下:
图7a-2
注:这个测试还可以,接下来代码上线。
第二步:代码上线
代码上线,测试一下,还可以,写下文档。接下来,就是连socket发消息了。
2.客户端连websocket发消息
描述:需要起一个客户端,通过websocket向服务端发消息,服务端来接收消息。
开工:
第一步:分析原接口
a.找原接口地址
20241211时间段:1016-1020
20241211时间段:1020-1040
http://localhost:9222/v1/conversation/completion
传参:
{"conversation_id":"39a7672db76711ef8bdbf020ff63f4c4","messages":[{"content":"你好! 我是专业宠物医生,有什么可以帮到你的吗?","role":"assistant"},{"id":"6b616117-c3cc-4788-a451-64c24d161418","content":"我家狗感冒了","role":"user","doc_ids":[]}]}注:这个要把聊天记录都传过去。这个接口是流式返回的,
截图如下:
图7a-3
注:先让客户端发个消息,服务端能接收。
b.客户端发消息
20241211时间段:1118-1120
20241211时间段:1120-1140
实现了,先写个接口,如下:
代码如下:
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
try:
while True:
data = await websocket.receive_text()
print(data)
await websocket.send_text(f"Message text was: {data}")
except WebSocketDisconnect:
print("Client disconnected")截图如下:
图7a-4
注:这个是服务端代码,客户端代码如下:
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
from fastapi.responses import HTMLResponse
app = FastAPI()
html = """
<!DOCTYPE html>
<html>
<head>
<title>WebSocket Test</title>
</head>
<body>
<h1>WebSocket Test</h1>
<form action="" onsubmit="sendMessage(event)">
<input type="text" id="messageText" autocomplete="off"/>
<button>Send</button>
</form>
<ul id='messages'>
</ul>
<script>
var ws = new WebSocket("ws://localhost:6789/ws");
ws.onmessage = function(event) {
var messages = document.getElementById('messages')
var message = document.createElement('li')
var content = document.createTextNode(event.data)
message.appendChild(content)
messages.appendChild(message)
};
function sendMessage(event) {
var input = document.getElementById("messageText")
ws.send(input.value)
input.value = ''
event.preventDefault()
}
</script>
</body>
</html>
"""
@app.get("/")
async def get():
return HTMLResponse(html)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8082)
截图如下:
图7a-5
注:把客户端main.py跑起来,服务端跑起来,这样,在浏览器中就可以访问了,如下:
图7a-6
注:就是说客户端给服务端发的消息,服务端能收到,并能打印出来,之后,服务端把消息返回客户端,客户端也能收到,并在浏览器上展示出来。
接下来,高能时刻来了,客户端向服务端发送json串,服务端请求接口,并流式返回数据。
第二步:客户端向服务端发json数据
发的数据为:
{"conversation_id":"39a7672db76711ef8bdbf020ff63f4c4","messages":[{"content":"你好! 我是专业宠物医生,有什么可以帮到你的吗?","role":"assistant"},{"id":"6b616117-c3cc-4788-a451-64c24d161418","content":"我家狗感冒了","role":"user","doc_ids":[]}]}注:现在不明白,它这个【我家狗感冒了】,前面这个id是怎么来的。看下代码。
a.id如何来
20241211时间段:1219-1240
研究发现是前端自己搞的。先不管,接下来,研究前端请求的接口。
b.客户端发json数据
20241211时间段:1456-1500 1500-1520
修改客户端代码如下:
图7a-7
注:服务端接收数据如下:
图7a-8
注:接收之后,转化为json对象,这样就可以请求接口了,接下来,处理接口方法流式返回数据。
c.客户端流式接收数据
服务端获取数据,这个要调ragflow封装的方法,接下来,看下怎么调封装的方法,本地先调下试试。
http://localhost:9222/v1/api/conversation/39a7672db76711ef8bdbf020ff63f4c4
测试结果如下:
图7a-9
注:这说明是可以调通的,只是token失效了。更新下代码。接下来,调通这个接口。
d.调通外连接口-40
20241211时间段:2114-2120
20241211时间段:2120-2140
20241211时间段:2140-2200
看下,token为什么失效,追踪下代码,如下:
图7a-10
注:经测试就是这个方法,现在报错,说是【Conversatio1111n not found!】,但数据库是有这个东东的,追踪下是怎么回事,是不是数据库搞错了。
e.追查数据库
20241211时间段:2154-2200
先追踪下sql,如下:
SELECT `t1`.`id`, `t1`.`create_time`, `t1`.`create_date`, `t1`.`update_time`, `t1`.`update_date`, `t1`.`dialog_id`, `t1`.`user_id`, `t1`.`message`, `t1`.`reference`, `t1`.`tokens`, `t1`.`source`, `t1`.`duration`, `t1`.`round`, `t1`.`thumb_up`
FROM `api_4_conversation` AS `t1`
WHERE (`t1`.`id` = '39a7672db76711ef8bdbf020ff63f4c4')
注:这个可以看出是一个新的表。
二、生活照片
拍摄于2025年8月3日,18:05:02,带孩子去海淀公园看水雾,当时,大宝七岁八个月,二宝两岁十个月。下午五点半,从图书馆回来的路上,我给大宝说,爸爸指定是爱你和你弟的。但你过了年就九岁了,你随便把脚穿鞋踩我身上,你觉得的这样对吗?你弟来说,别说用脚踩我,就是拉我身上,我没二话,为什么,因为你弟才两三岁,不懂事,你虚岁都十来岁了,你还不懂事吗,我如果不管你,由你这样发展下去,就这样宠着你,你哪天会不会说,爸,我有一口痰,我不想吐地上,我想吐你脸上;爸,我有尿,我不想去厕所,我想尿在餐桌上;你觉得的那样行吗?大宝说,我也没有尿桌子上啊?我说,我只是打个比方,如果不对你进行管教,你可能越来越放肆,做出现在看来不可思议的事。所以,父母指定爱你,把也会管你,就这样,你慢慢理解吧。
图7b-1
三、昨日花销(三级)
昨日花销截图如下:
图7c-1
《本文完》