Files
hsa/Html/apps/sockets/namespaces.py
2025-09-08 19:39:55 +08:00

127 lines
5.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# myapp/sockets/namespaces.py
import json
from flask import current_app, request, session
from flask_socketio import Namespace, join_room, leave_room, emit
from ..services.memory_service import save_chapter_memory_by_uuid
from ..services.backboard_service import realtime_response
from ..services.markdown_service import load_full_markdown_file
from ..extension_ase.ase_client import ASEngineClient
class VSCodeNamespace(Namespace):
def on_login(self,data):
ex = current_app.extensions
uuid2username = ex["uuid2username"]
backboard_manager = ex["backboard_manager"]
print("VSCode client connected")
print(data)
dataconfig = data['config']
user_uuid = dataconfig.get('user_uuid')
path = dataconfig.get('path')
course_id = dataconfig.get('course_id')
lesson_id = dataconfig.get('chapter_id')
print(f"User {user_uuid} connected with path: {path}")
join_room(user_uuid, namespace='/vscode')
if backboard_manager.get_backboard(user_uuid) == None:
backboard_manager.add_backboard(user_uuid,uuid2username[user_uuid], course_id, lesson_id, path)
def on_message(self, data):
print(f"Received from VSCode client: {data}")
dataconfig = data['config']
realtime_response(dataconfig, data)
# emit('response', {'message': 'Config data received and connection established'})
def on_disconnect(self, data):
print("VSCode client disconnected")
print("Disconnect reason:"+str(data))
class AgentNamespace(Namespace):
def on_login(self, data):
self.current_app = current_app
ex = current_app.extensions
uuid2username = ex["uuid2username"]
backboard_manager = ex["backboard_manager"]
agent_manager = ex["agent_manager"]
data = json.loads(data)
user_uuid = data['user_uuid']
course_id = data['course_id']
lesson_name = data['lesson_name']
chapter_name = data['chapter_name']
user_id = uuid2username[user_uuid]
session['user_uuid'] = user_uuid
print(f'User connected with session user_uuid: {user_uuid}')
user_uuid2ase_client = ex["user_uuid2ase_client"]
user_uuid2ase_client[user_uuid] = ASEngineClient(current_app.config["ASE_ENGINE_URL"], current_app.config["ASE_ENGINE_NAMESPACE"])
user_uuid2ase_client[user_uuid].connect()
user_uuid2ase_client[user_uuid].register_route_with_entry(
route='dialog',
callback=self.receive_ase_dialog,
entry=self, # 传你的 Namespace 对象
init_data={'room': user_uuid} # 想传啥都可以
)
fmd,fmdp,fsp = load_full_markdown_file(course_id, chapter_name, lesson_name)
# 从markdown、markdown_prompts、score_prompts中各读取数据folder.md并进行new_agent
user_uuid, agent = agent_manager.new_agent(course_id, lesson_name, fmd, fmdp, fsp, id=user_uuid,
root_path=f'../../study/{user_id}/{course_id}/{chapter_name}/{lesson_name}')
print(user_uuid)
join_room(user_uuid, namespace='/agent') # 将该用户加入以user_id为名的room
backboard_manager.add_backboard(user_uuid, user_id, course_id, lesson_name, root_path=f'../../study/{user_id}/{course_id}/{chapter_name}/{lesson_name}')
def on_language(self, language):
ex = current_app.extensions
agent_manager = ex["agent_manager"]
uuid2username = ex["uuid2username"]
uuid = session.get('user_uuid')
user_id = uuid2username[uuid]
agent_manager.change_language(uuid, language)
def on_message(self, data):
print(f"Message from client: {data}")
ex = current_app.extensions
agent_manager = ex["agent_manager"]
backboard_manager = ex["backboard_manager"]
uuid = session.get('user_uuid')
uuid2username = ex["uuid2username"]
user_id = uuid2username[uuid]
user_uuid2ase_client = ex["user_uuid2ase_client"]
if (type(data)==str):
data = json.loads(data)
if data['type'] == 'text':
# res = agent_manager.invoke(uuid, data['data'], backboard_manager.get_backboard(uuid).get_info_prompt())
user_uuid2ase_client[uuid].send_text('dialog', data['data'])
# print('=*='*20)
# print(res.content)
# reply = f"{res.content['speak']}"
# with current_app.app_context():
# emit('message',reply, room=uuid, namespace='/agent')
# emit('request_function',res.content['function'], room=uuid, namespace='/agent')
if data['type'] == 'function':
agent_manager.function_call(uuid, data['data'])
def receive_ase_dialog(client_entry: ASEngineClient, namespace_entry: Namespace, data, init_data):
print(f"Received from ASEngine: {data}")
# 直接使用 entry也就是你的 Namespace 对象)
namespace_entry.emit('message', data['data'], room=init_data['room'], namespace='/agent')
def on_initiative(self,data):
print("User active function call")
ex = current_app.extensions
agent_manager = ex["agent_manager"]
backboard_manager = ex["backboard_manager"]
uuid = session.get('user_uuid')
if data['name'] == 'sample_judge':
agent_manager.sample_judge(uuid, backboard_manager.get_backboard(uuid))
if data['name'] == 'judge':
agent_manager.judge(uuid, backboard_manager.get_backboard(uuid))
def on_disconnect(self,data):
print("VSCode client disconnected")
print("Disconnect reason:"+str(data))