|
|
|
@ -26,10 +26,6 @@ from WxMini.Utils.TtsUtil import TTS
|
|
|
|
|
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
# 配置 JWT
|
|
|
|
|
SECRET_KEY = "DsideaL4r5t6y7u" # 替换为你的密钥
|
|
|
|
|
ALGORITHM = "HS256"
|
|
|
|
|
ACCESS_TOKEN_EXPIRE_MINUTES = 24 * 60 * 30 # 一个月有效期
|
|
|
|
|
# 密码加密上下文
|
|
|
|
|
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
|
|
|
|
|
# OAuth2 密码模式
|
|
|
|
@ -83,31 +79,38 @@ async def on_session_end(person_id):
|
|
|
|
|
history = "无聊天记录"
|
|
|
|
|
|
|
|
|
|
# 将历史聊天记录发给大模型,让它帮我分析一下
|
|
|
|
|
with open("Input.txt", "r", encoding="utf-8") as file:
|
|
|
|
|
input_word = file.read()
|
|
|
|
|
prompt = (
|
|
|
|
|
"我将把用户与AI大模型交流的记录发给你,帮我分析一下这个用户是否存在心理健康方面的问题,"
|
|
|
|
|
"参考:1、PHQ-9抑郁症筛查量表和2、Beck自杀意念评量表(BSI-CV)。"
|
|
|
|
|
f"参考分类文档内容如下:{input_word}"
|
|
|
|
|
"如果没有健康问题请回复: OK;否则回复:NO,换行后再输出是什么问题。"
|
|
|
|
|
f"\n\n历史聊天记录:{history}"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
response = await client.chat.completions.create(
|
|
|
|
|
model=MODEL_NAME,
|
|
|
|
|
messages=[
|
|
|
|
|
{"role": "system", "content": "你是一个心理健康分析助手,负责分析用户的心理健康状况。"},
|
|
|
|
|
{"role": "user", "content": prompt}
|
|
|
|
|
],
|
|
|
|
|
max_tokens=1000
|
|
|
|
|
)
|
|
|
|
|
# 使用 asyncio.create_task 异步执行大模型调用
|
|
|
|
|
async def analyze_mental_health():
|
|
|
|
|
response = await client.chat.completions.create(
|
|
|
|
|
model=MODEL_NAME,
|
|
|
|
|
messages=[
|
|
|
|
|
{"role": "system", "content": "你是一个心理健康分析助手,负责分析用户的心理健康状况。"},
|
|
|
|
|
{"role": "user", "content": prompt}
|
|
|
|
|
],
|
|
|
|
|
max_tokens=1000
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# 处理分析结果
|
|
|
|
|
if response.choices and response.choices[0].message.content:
|
|
|
|
|
analysis_result = response.choices[0].message.content.strip()
|
|
|
|
|
if analysis_result.startswith("NO"):
|
|
|
|
|
# 异步执行 update_risk
|
|
|
|
|
asyncio.create_task(update_risk(app.state.mysql_pool, person_id, analysis_result))
|
|
|
|
|
logger.info(f"已异步更新 person_id={person_id} 的风险状态。")
|
|
|
|
|
else:
|
|
|
|
|
logger.info(f"AI大模型没有发现任何心理健康问题,用户会话 {person_id} 没有风险。")
|
|
|
|
|
# 处理分析结果
|
|
|
|
|
if response.choices and response.choices[0].message.content:
|
|
|
|
|
analysis_result = response.choices[0].message.content.strip()
|
|
|
|
|
if analysis_result.startswith("NO"):
|
|
|
|
|
# 异步执行 update_risk
|
|
|
|
|
await update_risk(app.state.mysql_pool, person_id, analysis_result)
|
|
|
|
|
logger.info(f"已异步更新 person_id={person_id} 的风险状态。")
|
|
|
|
|
else:
|
|
|
|
|
logger.info(f"AI大模型没有发现任何心理健康问题,用户会话 {person_id} 没有风险。")
|
|
|
|
|
|
|
|
|
|
# 创建异步任务
|
|
|
|
|
asyncio.create_task(analyze_mental_health())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 初始化 FastAPI 应用
|
|
|
|
@ -133,7 +136,7 @@ def create_access_token(data: dict, expires_delta: Optional[timedelta] = None):
|
|
|
|
|
else:
|
|
|
|
|
expire = datetime.utcnow() + timedelta(minutes=15)
|
|
|
|
|
to_encode.update({"exp": expire})
|
|
|
|
|
encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
|
|
|
|
|
encoded_jwt = jwt.encode(to_encode, JWT_SECRET_KEY, algorithm=ALGORITHM)
|
|
|
|
|
return encoded_jwt
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -145,7 +148,7 @@ async def get_current_user(token: str = Depends(oauth2_scheme)):
|
|
|
|
|
headers={"WWW-Authenticate": "Bearer"},
|
|
|
|
|
)
|
|
|
|
|
try:
|
|
|
|
|
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
|
|
|
|
|
payload = jwt.decode(token, JWT_SECRET_KEY, algorithms=[ALGORITHM])
|
|
|
|
|
login_name: str = payload.get("sub")
|
|
|
|
|
if login_name is None:
|
|
|
|
|
raise credentials_exception
|
|
|
|
|