feat:新增按指定用户返回已预定结果,新增会议室名称和Id的映射关系,兼容名称ID混用,

This commit is contained in:
yujj128
2025-07-07 17:38:48 +08:00
parent eca567dafd
commit a57e93d58b
2 changed files with 94 additions and 24 deletions

View File

@@ -110,9 +110,8 @@ def query_room_info(data: dict, params: dict) -> str:
if data.get('Region') and data.get('Region') != 'None':
region = data.get('Region')
for b in result:
if (region in b.get('name', 'default') or region in b.get('typeName', 'default')) and b.get('capacity',
0) >= data.get(
'capacity', 0):
if ((region in b.get('name', 'default') or region in b.get('typeName', 'default'))
and b.get('capacity',0) >= data.get('capacity', 0)):
new_list.append(b)
if len(new_list) >= DEFAULT_QUERY_SIZE:
logger.debug("regin--------------- {0}".format(new_list))
@@ -153,6 +152,36 @@ def query_booking_info(params: dict) -> str:
return error_respones.format("查询已预定会议")
def query_booking_info_by_user(params: dict):
logger.info("Start to query_booking_info_by_user")
user_id = params.get('user_id', None)
try:
if not user_id:
raise Exception("userId cannot be empty")
all_book_info = query_booking_info(params)
if isinstance(all_book_info, dict):
logger.info("all_book_info is dict")
rooms = all_book_info.get("data", [])
logger.debug("rooms is {0}".format(rooms))
book_info = []
if rooms:
for room in rooms:
filtered_meetings = [meeting for meeting in room['meetingDTOList'] if meeting['ownerId'] == user_id]
if filtered_meetings:
filter_room = room.copy()
filter_room['meetingDTOList'] = filtered_meetings
book_info.append(filter_room)
result = {'code': all_book_info['code'], 'data': book_info}
print("result is -----------",result)
return result
else:
raise Exception("query_booking_info failed")
except Exception as e:
logger.error("location: query_booking_info_by_user => {0}".format(str(e)))
return error_respones.format(f"查询指定用户{user_id}已预定会议")
'''
预定会议
'''
@@ -180,7 +209,7 @@ def book_meeting(params: dict, data: dict) -> str:
}
params: tenantId (not null)
"""
user_id = params.get('user_id', None)
new_data = {
"subject": data.get('subject','系统默认主题'),
"meetingRoomId": data["room_id"],
@@ -189,7 +218,7 @@ def book_meeting(params: dict, data: dict) -> str:
"startDateTimeStamp": parse_time(data["start_time"]),
"endDateTimeStamp": parse_time(data["end_time"]),
"meetingPersonYhtUserIds": [
user_id
],
"meetingPersonAmount": data["capacity"],
"remindArray": [
@@ -284,6 +313,25 @@ def check_and_process_think(content: str) -> str:
return filtered_text
def map_meetingname_to_id(params: dict):
map_info = []
data = {}
try:
room_info = json.loads(query_room_info(data=data, params=params))
if isinstance(room_info, str):
raise Exception(f"get room_info error:{room_info}")
for room in room_info:
room_id = room.get('id')
room_name = room.get('name')
map_info.append({room_id: room_name})
logger.info(f"map_info => {map_info}")
return map_info
except Exception as ex:
logger.error("location: map_meetingname_to_id => {0}".format(str(ex)))
return error_respones.format("获取会议室名称和会议室Id的映射")
'''
初始提示词构建
'''
@@ -325,7 +373,11 @@ def build_prompt(params):
"func_name":"query_booking_info"
}
'''
qry_user_book_info_for_mart_str = '''
{
"func_name":"query_user_booking_info"
}
'''
cancel_meeting_info_for_mart_str = '''
{
@@ -358,6 +410,7 @@ def build_prompt(params):
##ROLE##:
你是一个专业的OA会议预订助手请根据以下信息提供服务
现在时间是 :{time_now}
会议室名称和Id的映射是{map_meetingname_to_id(params)}
##TASK##:
请按以下步骤处理:
1. 预订会议室
@@ -387,10 +440,10 @@ def build_prompt(params):
3. 取消会议
当用户表达取消会议意向时:
(1) 先检查用户是否提供以下信息:
会议Id(该信息禁止从历史对话中查找,注意:会议Id是长度大于15位的纯数字编号)
会议Id(该信息禁止从历史对话和上下文中查找,只能由用户提供,注意会议Id是长度大于15位的纯数字编号)
(2) 若信息不全,先查询用户所有预定禁止联想历史上下文数据直接返回json示例如下
```
{qry_book_info_for_mart_str}
{qry_user_book_info_for_mart_str}
```
将查询结果以友好的方式列出,推荐方式:{return_booking_info_str}
(3) 若信息完整直接返回以下标准JSON
@@ -403,7 +456,7 @@ def build_prompt(params):
会议编号,会议开始时间,会议结束时间,会议主题
(2) 若会议编号未提供, 无需询问用户,直接查询用户所有预定,提供给用户选择,禁止假设返回信息,直接返回json示例如下
```
{qry_book_info_for_mart_str}
{qry_user_book_info_for_mart_str}
```
将查询结果以友好的方式列出,过滤掉已经结束的会议,推荐方式:{return_booking_info_str}
@@ -586,7 +639,22 @@ def process_query_book_room(**kwargs) -> tuple:
```
{result}
```
请帮用户解析已有的预订会议室的结果,此次操作根据本次查询的结果进行推理,不要省略且结果中需要返回会议ID,必须返回处理后的查询结果:
请帮用户解析已有的预订会议室的结果,此次操作根据本次查询的结果进行推理,不要省略且结果中需要返回会议ID,必须为用户返回处理后的查询结果供用户查看或选择
'''
return False, book_promot
'''
查询指定用户的已预定信息
'''
def process_user_query_book_room(**kwargs) -> tuple:
result = query_booking_info_by_user(params=kwargs['params'])
book_promot = f'''
系统调用API查询当前用户下已经预订的会议室的结果如下:
```
{result}
```
请帮用户解析已有的预订会议室的结果,此次操作根据本次查询的结果进行推理,不要省略且结果中需要返回会议ID,必须为用户返回处理后的查询结果供用户查看或选择:
'''
return False, book_promot
@@ -650,7 +718,8 @@ func_tion_call_map = {
"query_booking_info": process_query_book_room,
"cancel_room_meeting": process_cancel_room_meeting,
"edit_room_meeting": process_edit_room_meeting,
"query_avali_room":process_query_avali_room
"query_avali_room":process_query_avali_room,
"query_user_booking_info":process_user_query_book_room
}
@@ -674,16 +743,16 @@ def extract_json_blocks(text):
'''
def process_chat(user_id: str, user_input: str, params: dict):
def process_chat(covers_id:str,user_id: str, user_input: str, params: dict):
history = []
query_history = dialog_manager.get_history(user_id)
query_history = dialog_manager.get_history(covers_id)
history.extend(query_history)
prompt = ''
if history is None or len(history) == 0:
prompt = build_prompt(params)
add_message_async(dialog_manager, user_id, 'user', prompt)
logger.debug("step1---userinput----------{0}".format(user_input))
add_message_async(dialog_manager, user_id, 'user', user_input)
add_message_async(dialog_manager, covers_id, 'user', prompt)
logger.info("step1---userinput----------{0}".format(user_input))
add_message_async(dialog_manager, covers_id, 'user', user_input)
resp = call_openai_api(model=MODEL_NAME, system_prompt=prompt, user_query=user_input,
api_key=config('MODEL_API_KEY'),
history=history, temperature=config("MODEL_TEMPERATURE", cast=float, default=0.5))
@@ -693,9 +762,9 @@ def process_chat(user_id: str, user_input: str, params: dict):
logger.info(f"process chat content is : {content}")
if "func_name" in content:
# new_content = check_and_process_think(content=content)
add_message_async(dialog_manager, user_id, 'assistant', content)
add_message_async(dialog_manager, covers_id, 'assistant', content)
json_content = extract_json_blocks(content)
logger.debug("step3--jsoncontent----------{0}".format(json_content))
logger.info("step3--jsoncontent----------{0}".format(json_content))
for json_item in json_content:
logger.info("jsonitem:{0} type{1}".format(json_item,type(json_item)))
@@ -711,6 +780,7 @@ def process_chat(user_id: str, user_input: str, params: dict):
if func:
# 触发函数调用------
logger.info(f"触发系统函数调用==>:{fun_name}")
params["user_id"] = user_id
add_to_content, book_promot = func(data=data, params=params)
logger.info("test point book_promot => {0} ".format(book_promot))
@@ -729,7 +799,7 @@ def process_chat(user_id: str, user_input: str, params: dict):
'''
new_history = []
logger.info("test point completed the function call ")
query_history = dialog_manager.get_history(user_id)
query_history = dialog_manager.get_history(covers_id)
new_history.extend(query_history)
resp = call_openai_api(model=MODEL_NAME, user_query=book_promot,
api_key=config('MODEL_API_KEY'),
@@ -741,15 +811,15 @@ def process_chat(user_id: str, user_input: str, params: dict):
logger.info("final content => {0}".format(content))
new_content = check_and_process_think(content)
if add_to_content:
dialog_manager.add_message(user_id, 'user', book_promot)
add_message_async(dialog_manager, user_id, 'assistant', new_content)
dialog_manager.add_message(covers_id, 'user', book_promot)
add_message_async(dialog_manager, covers_id, 'assistant', new_content)
return {'response': new_content}
return {'response': content}
else:
new_content = check_and_process_think(content=content)
logger.info("no func ")
add_message_async(dialog_manager, user_id, 'assistant', new_content)
add_message_async(dialog_manager, covers_id, 'assistant', new_content)
if reasoning_content:
add_message_async(dialog_manager, user_id, 'assistant', reasoning_content)
add_message_async(dialog_manager, covers_id, 'assistant', reasoning_content)
return {'response': new_content}

View File

@@ -236,5 +236,5 @@ def room_chat(request):
if yht_token:
params['yht_access_token'] = yht_token
data = json.loads(request.body)
resp = process_chat(data['user_id'], data['user_query'], params)
resp = process_chat(data['covers_id'],data['user_id'], data['user_query'], params)
return JsonResponse(resp)