Skip to content

Commit d41598e

Browse files
committed
feat: Adjust the organizational attribution logic of dialogues in MCP #1221
1 parent 8ad3837 commit d41598e

2 files changed

Lines changed: 60 additions & 36 deletions

File tree

backend/apps/chat/models/chat_model.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -353,11 +353,19 @@ class McpDs(BaseModel):
353353
oid: Optional[str] = Body(description='组织ID,如果不传则为最后一次登录SQLBot时所使用的组织ID', default=None)
354354

355355

356-
class ChatStart(BaseModel):
356+
class ChatToken(BaseModel):
357357
username: str = Body(description='用户名')
358358
password: str = Body(description='密码')
359359

360360

361+
class ChatStart(BaseModel):
362+
username: str = Body(description='用户名', default=None)
363+
password: str = Body(description='密码', default=None)
364+
token: str = Body(description='token', default=None)
365+
oid: Optional[str] = Body(
366+
description='组织ID,仅当数据源ID为空时有效,如果不传则为最后一次登录SQLBot时所使用的组织ID', default=None)
367+
368+
361369
class ChatQuestionBase(BaseModel):
362370
question: str = Body(description='用户提问')
363371
chat_id: int = Body(description='会话ID')
@@ -368,8 +376,6 @@ class McpQuestion(ChatQuestionBase):
368376
stream: Optional[bool] = Body(description='是否流式输出,默认为true开启, 关闭false则返回JSON对象', default=True)
369377
lang: Optional[str] = Body(description='语言:zh-CN|zh-TW|en|ko-KR', default='zh-CN')
370378
datasource_id: Optional[int | str] = Body(description='数据源ID,仅当当前对话没有确定数据源时有效', default=None)
371-
oid: Optional[str] = Body(
372-
description='组织ID,仅当数据源ID为空时有效,如果不传则为最后一次登录SQLBot时所使用的组织ID', default=None)
373379
return_img: Optional[bool] = Body(description='是否返回图表,默认为true开启, 关闭false则仅返回数据', default=True)
374380

375381

backend/apps/mcp/mcp.py

Lines changed: 51 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
from apps.chat.api.chat import create_chat, question_answer_inner
1515
from apps.chat.models.chat_model import ChatMcp, CreateChat, ChatStart, McpQuestion, McpAssistant, ChatQuestion, \
16-
ChatFinishStep, McpDs
16+
ChatFinishStep, McpDs, ChatToken
1717
from apps.datasource.crud.datasource import get_datasource_list
1818
from apps.system.crud.user import authenticate, user_ws_options
1919
from apps.system.crud.user import get_db_user
@@ -34,19 +34,21 @@
3434
router = APIRouter(tags=["mcp"], prefix="/mcp")
3535

3636

37-
# @router.post("/access_token", operation_id="access_token")
38-
# def local_login(
39-
# session: SessionDep,
40-
# form_data: Annotated[OAuth2PasswordRequestForm, Depends()]
41-
# ) -> Token:
42-
# user = authenticate(session=session, account=form_data.username, password=form_data.password)
43-
# if not user:
44-
# raise HTTPException(status_code=400, detail="Incorrect account or password")
45-
# access_token_expires = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES)
46-
# user_dict = user.to_dict()
47-
# return Token(access_token=create_access_token(
48-
# user_dict, expires_delta=access_token_expires
49-
# ))
37+
@router.post("/access_token", operation_id="access_token")
38+
async def access_token(session: SessionDep, chat: ChatToken):
39+
user: BaseUserDTO = authenticate(session=session, account=chat.username, password=chat.password)
40+
if not user:
41+
raise HTTPException(status_code=400, detail="Incorrect account or password")
42+
43+
if not user.oid or user.oid == 0:
44+
raise HTTPException(status_code=400, detail="No associated workspace, Please contact the administrator")
45+
access_token_expires = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES)
46+
user_dict = user.to_dict()
47+
t = Token(access_token=create_access_token(
48+
user_dict, expires_delta=access_token_expires
49+
))
50+
# c = create_chat(session, user, CreateChat(origin=1), False)
51+
return {"access_token": t.access_token}
5052

5153

5254
def get_user(session: SessionDep, token: str):
@@ -82,20 +84,36 @@ def get_user(session: SessionDep, token: str):
8284

8385

8486
@router.post("/mcp_start", operation_id="mcp_start")
85-
async def mcp_start(session: SessionDep, chat: ChatStart):
86-
user: BaseUserDTO = authenticate(session=session, account=chat.username, password=chat.password)
87-
if not user:
88-
raise HTTPException(status_code=400, detail="Incorrect account or password")
87+
async def mcp_start(session: SessionDep, trans: Trans, chat: ChatStart):
88+
res_token = None
89+
user = None
90+
if chat.token:
91+
res_token = chat.token
92+
user = get_user(session, chat.token)
93+
else:
94+
user = authenticate(session=session, account=chat.username, password=chat.password)
95+
if not user:
96+
raise HTTPException(status_code=400, detail="Incorrect account or password")
97+
98+
if not user.oid or user.oid == 0:
99+
raise HTTPException(status_code=400, detail="No associated workspace, Please contact the administrator")
100+
access_token_expires = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES)
101+
user_dict = user.to_dict()
102+
t = Token(access_token=create_access_token(
103+
user_dict, expires_delta=access_token_expires
104+
))
105+
res_token = t.access_token
106+
107+
if chat.oid:
108+
w_list = await user_ws_options(session, user.id, trans)
109+
oid_list = [item.id for item in w_list]
110+
if int(chat.oid) not in oid_list:
111+
raise HTTPException(status_code=400, detail="The current user is not in the selected workspace")
112+
113+
user.oid = int(chat.oid)
89114

90-
if not user.oid or user.oid == 0:
91-
raise HTTPException(status_code=400, detail="No associated workspace, Please contact the administrator")
92-
access_token_expires = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES)
93-
user_dict = user.to_dict()
94-
t = Token(access_token=create_access_token(
95-
user_dict, expires_delta=access_token_expires
96-
))
97115
c = create_chat(session, user, CreateChat(origin=1), False)
98-
return {"access_token": t.access_token, "chat_id": c.id}
116+
return {"access_token": res_token, "chat_id": c.id}
99117

100118

101119
@router.post("/mcp_ws_list", operation_id="mcp_ws_list")
@@ -139,13 +157,13 @@ async def mcp_question(session: SessionDep, trans: Trans, chat: McpQuestion):
139157
lang = chat.lang
140158
if lang in ["zh-CN", "zh-TW", "en", "ko-KR"]:
141159
session_user.language = lang
142-
if chat.oid:
143-
w_list = await user_ws_options(session, session_user.id, trans)
144-
oid_list = [item.id for item in w_list]
145-
if int(chat.oid) not in oid_list:
146-
raise HTTPException(status_code=400, detail="The current user is not in the selected workspace")
147-
148-
session_user.oid = int(chat.oid)
160+
# if chat.oid:
161+
# w_list = await user_ws_options(session, session_user.id, trans)
162+
# oid_list = [item.id for item in w_list]
163+
# if int(chat.oid) not in oid_list:
164+
# raise HTTPException(status_code=400, detail="The current user is not in the selected workspace")
165+
#
166+
# session_user.oid = int(chat.oid)
149167
ds_id: Optional[int] = None
150168
if chat.datasource_id:
151169
if isinstance(chat.datasource_id, str):

0 commit comments

Comments
 (0)