You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

84 lines
2.5 KiB

# !/usr/bin/env python3
# -*- encoding : utf-8 -*-
# @Filename : views.py
# @Software : VSCode
# @Datetime : 2023/03/20 15:56:34
# @Author : leo liu
# @Version : 1.0
# @Description :
from typing import Optional, Any
from fastapi import APIRouter, Depends, Header
from sqlalchemy.orm.session import Session
from extensions import logger
from core import security
from utils import response_code, custom_exc
from db.session import get_db
from models import User, ChatHistory
from .schemas import chat_schema
from .ctrl.chat import CTRLChat
from ..auth.crud.user import CRUDUser
from .crud.chat import CRUDChat
router = APIRouter()
def get_current_user(
db: Session = Depends(get_db), token: Optional[str] = Header(None)
) -> User:
"""
根据header中token 获取当前用户
:param db:
:param token:
:return:
"""
if not token:
raise custom_exc.TokenAuthError(err_desc='headers not found token')
crud_user = CRUDUser(User)
token_data = security.check_jwt_token(token)
user = crud_user.get(db, id=token_data.sub)
if not user:
raise custom_exc.UserNotFound(err_desc="user not found")
return user
@router.post("/chat/ask", summary="提问")
async def ask(
*,
db: Session = Depends(get_db),
security: Optional[bool] = Depends(security.check_jwt_token),
current_user: User = Depends(get_current_user),
chat_info:chat_schema.Chat = None
) -> Any:
if not chat_info:
return response_code.resp_200(data="", message="no chat info")
crud_chat = CRUDChat(ChatHistory)
ctrl_chat = CTRLChat()
q_times = crud_chat.get_chat_count(db, current_user)
q_limit_day = current_user.q_limit_day
if ((q_limit_day > 0 and q_times >= q_limit_day) or q_limit_day < 0):
return response_code.resp_200(data="您今天的提问次数已达到限额,欢迎您明日再来!", message="success chat with j-med")
openai_keys = crud_chat.get_openai_keys(db)
default_max_tokens = crud_chat.get_default_max_tokens(db)
if not openai_keys or len(openai_keys) <= 0:
return response_code.resp_200(data="", message="no openai_key defined")
key = openai_keys[0]
tokens_limit = current_user.tokens_limit
if tokens_limit == 0:
tokens_limit = default_max_tokens
answer = ctrl_chat.chat(key, chat_info.question, tokens_limit)
crud_chat.update_chat_count(db, current_user)
crud_chat.new_chat(db, current_user, chat_info.question, answer)
return response_code.resp_200(data=answer, message="success chat with j-med")