33
44from datetime import timedelta
55
6- from fastapi import APIRouter , HTTPException
6+ import jwt
7+ from fastapi import HTTPException , status , APIRouter
78from fastapi .responses import StreamingResponse
9+ # from fastapi.security import OAuth2PasswordBearer
10+ from jwt .exceptions import InvalidTokenError
11+ from pydantic import ValidationError
812
913from apps .chat .api .chat import create_chat
1014from apps .chat .models .chat_model import ChatMcp , CreateChat , ChatStart
1115from apps .chat .task .llm import LLMService , run_task
12- from apps .datasource .crud .datasource import get_datasource_list
13- from apps .system .crud .user import authenticate
14- from apps .system .models .system_model import AiModelDetail
16+ from apps .system .crud .user import authenticate , get_user_info
17+ from apps .system .schemas .system_schema import BaseUserDTO
18+ from apps .system .schemas .system_schema import UserInfoDTO
19+ from common .core import security
1520from common .core .config import settings
16- from common .core .deps import SessionDep , get_current_user
17- from common .core .schemas import Token
21+ from common .core .deps import SessionDep
22+ from common .core .schemas import TokenPayload , XOAuth2PasswordBearer , Token
1823from common .core .security import create_access_token
1924
25+ reusable_oauth2 = XOAuth2PasswordBearer (
26+ tokenUrl = f"{ settings .API_V1_STR } /login/access-token"
27+ )
28+
2029router = APIRouter (tags = ["mcp" ], prefix = "/mcp" )
2130
2231
3544# ))
3645
3746
38- @router .get ("/ds_list" , operation_id = "get_datasource_list" )
39- async def datasource_list (session : SessionDep ):
40- return get_datasource_list (session = session )
41-
42-
43- @router .get ("/model_list" , operation_id = "get_model_list" )
44- async def get_model_list (session : SessionDep ):
45- return session .query (AiModelDetail ).all ()
47+ # @router.get("/ds_list", operation_id="get_datasource_list")
48+ # async def datasource_list(session: SessionDep):
49+ # return get_datasource_list(session=session)
50+ #
51+ #
52+ # @router.get("/model_list", operation_id="get_model_list")
53+ # async def get_model_list(session: SessionDep):
54+ # return session.query(AiModelDetail).all()
4655
4756
4857@router .post ("/mcp_start" , operation_id = "mcp_start" )
4958async def mcp_start (session : SessionDep , chat : ChatStart ):
50- user = authenticate (session = session , account = chat .username , password = chat .password )
59+ user : BaseUserDTO = authenticate (session = session , account = chat .username , password = chat .password )
5160 if not user :
5261 raise HTTPException (status_code = 400 , detail = "Incorrect account or password" )
62+
63+ if not user .oid or user .oid == 0 :
64+ raise HTTPException (status_code = 400 , detail = "No associated workspace, Please contact the administrator" )
5365 access_token_expires = timedelta (minutes = settings .ACCESS_TOKEN_EXPIRE_MINUTES )
5466 user_dict = user .to_dict ()
5567 t = Token (access_token = create_access_token (
@@ -61,9 +73,26 @@ async def mcp_start(session: SessionDep, chat: ChatStart):
6173
6274@router .post ("/mcp_question" , operation_id = "mcp_question" )
6375async def mcp_question (session : SessionDep , chat : ChatMcp ):
64- user = await get_current_user (session , chat .token )
65-
66- llm_service = LLMService (session , user , chat )
76+ try :
77+ payload = jwt .decode (
78+ chat .token , settings .SECRET_KEY , algorithms = [security .ALGORITHM ]
79+ )
80+ token_data = TokenPayload (** payload )
81+ except (InvalidTokenError , ValidationError ):
82+ raise HTTPException (
83+ status_code = status .HTTP_403_FORBIDDEN ,
84+ detail = "Could not validate credentials" ,
85+ )
86+ session_user = await get_user_info (session = session , user_id = token_data .id )
87+ session_user = UserInfoDTO .model_validate (session_user )
88+ if not session_user :
89+ raise HTTPException (status_code = 404 , detail = "User not found" )
90+
91+ if session_user .status != 1 :
92+ raise HTTPException (status_code = 400 , detail = "Inactive user" )
93+
94+ # ask
95+ llm_service = LLMService (session , session_user , chat )
6796 llm_service .init_record ()
6897
6998 return StreamingResponse (run_task (llm_service , False ), media_type = "text/event-stream" )
0 commit comments