2026-04-02 11:36:05 +08:00
|
|
|
|
from fastapi import Body, HTTPException
|
|
|
|
|
|
from configs import LLM_MODELS, TEMPERATURE, MAX_TOKENS
|
|
|
|
|
|
from configs.model_config import DEEPSEEK_MODELS
|
|
|
|
|
|
from server.chat.policy_fun_iast import get_llm_model_response
|
|
|
|
|
|
from typing import List, Dict, Optional, Union
|
|
|
|
|
|
import logging
|
|
|
|
|
|
from pydantic import BaseModel
|
|
|
|
|
|
from server.chat.utils import History
|
|
|
|
|
|
|
|
|
|
|
|
# 初始化日志
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async def gen_title(
|
|
|
|
|
|
history: List[History] = Body([],
|
|
|
|
|
|
description="历史对话,设为一个整数可以从数据库中读取历史消息",
|
|
|
|
|
|
examples=[[
|
|
|
|
|
|
{"role": "user",
|
|
|
|
|
|
"content": "我们来玩成语接龙,我先来,生龙活虎"},
|
|
|
|
|
|
{"role": "assistant", "content": "虎头虎脑"}]]
|
|
|
|
|
|
),
|
2026-04-07 10:32:14 +08:00
|
|
|
|
model_name: Optional[str] = Body(LLM_MODELS[0], description="LLM 模型名称。"),
|
2026-04-02 11:36:05 +08:00
|
|
|
|
):
|
|
|
|
|
|
"""
|
|
|
|
|
|
根据一轮对话历史生成简洁标题\n
|
|
|
|
|
|
:param history:第一轮对话历史\n
|
|
|
|
|
|
:param model_name:模型名称,非必传\n
|
|
|
|
|
|
:return: 返回一个字典,包含title字段,值为生成的标题。
|
|
|
|
|
|
"""
|
|
|
|
|
|
history = [History.to_msg_tuple(h) for h in history]
|
|
|
|
|
|
|
|
|
|
|
|
if model_name == "R1-70B":
|
|
|
|
|
|
model_name = DEEPSEEK_MODELS[1]
|
|
|
|
|
|
elif model_name == "QIANWEN":
|
2026-04-07 10:32:14 +08:00
|
|
|
|
model_name = LLM_MODELS[0]
|
2026-04-02 11:36:05 +08:00
|
|
|
|
else:
|
|
|
|
|
|
model_name = model_name
|
|
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
|
logger.info("开始生成对话标题...")
|
|
|
|
|
|
|
|
|
|
|
|
# 调用模型生成标题
|
|
|
|
|
|
conv_title = get_llm_model_response(
|
|
|
|
|
|
strategy_name="gen_title",
|
|
|
|
|
|
llm_model_name=model_name,
|
|
|
|
|
|
template_prompt_name="gen_title",
|
|
|
|
|
|
prompt_param_dict={"history": history},
|
|
|
|
|
|
temperature=TEMPERATURE,
|
|
|
|
|
|
max_tokens=MAX_TOKENS
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
# 清理返回结果
|
|
|
|
|
|
clean_title = conv_title.strip("“”\"'")
|
|
|
|
|
|
logger.info(f"成功生成对话标题: {clean_title}")
|
|
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
|
"status_code": 200,
|
|
|
|
|
|
"data": {"title": clean_title},
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
except HTTPException:
|
|
|
|
|
|
raise # 主动抛出的HTTP异常直接传递
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
logger.exception("标题生成失败")
|
|
|
|
|
|
return {
|
|
|
|
|
|
"status_code": 500,
|
|
|
|
|
|
"data": {"title": ""},
|
|
|
|
|
|
"error": f"标题生成失败: {str(e)}"
|
|
|
|
|
|
}
|
|
|
|
|
|
|