Skip to content

Commit aac200a

Browse files
fix(X-Pack): Assistant API call timeout issue #1288
1 parent 8424dcb commit aac200a

3 files changed

Lines changed: 19 additions & 4 deletions

File tree

backend/apps/chat/api/chat.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,8 +175,13 @@ async def start_chat(session: SessionDep, current_user: CurrentUser, create_chat
175175
async def start_chat(session: SessionDep, current_user: CurrentUser, current_assistant: CurrentAssistant,
176176
create_chat_obj: CreateChat = CreateChat(origin=2)):
177177
try:
178-
return create_chat(session, current_user, create_chat_obj, create_chat_obj and create_chat_obj.datasource,
179-
current_assistant)
178+
# create_chat 内会经 AssistantOutDsFactory.get_instance 同步请求宿主 API
179+
# (requests.get,默认 10s 超时),必须放工作线程执行,避免阻塞事件循环(Issue #1288)
180+
def inner():
181+
return create_chat(session, current_user, create_chat_obj, create_chat_obj and create_chat_obj.datasource,
182+
current_assistant)
183+
184+
return await asyncio.to_thread(inner)
180185
except Exception as e:
181186
raise HTTPException(
182187
status_code=500,

backend/apps/chat/task/llm.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import asyncio
12
import concurrent
23
import json
34
import os
@@ -235,7 +236,10 @@ async def create(cls, *args, **kwargs):
235236
specialized_model_id = args[2].custom_model
236237
print("use custom model: id[" + specialized_model_id + "]")
237238
config: LLMConfig = await get_default_config(specialized_model_id)
238-
instance = cls(*args, **kwargs, config=config)
239+
# 构造函数可能同步调用宿主 API(type==1 高级应用动态数据源,
240+
# LLMService.__init__ -> AssistantOutDsFactory.get_instance -> requests.get),
241+
# 必须在工作线程执行,避免阻塞事件循环(Issue #1288)
242+
instance = await asyncio.to_thread(cls, *args, **kwargs, config=config)
239243

240244
chat_params: list[SysArgModel] = await get_groups(args[0], "chat")
241245
for config in chat_params:

backend/apps/system/api/assistant.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import asyncio
12
import json
23
import os
34
from datetime import datetime, timedelta, timezone
@@ -285,7 +286,12 @@ async def ds(session: SessionDep, current_assistant: CurrentAssistant):
285286
}
286287
for ds in db_ds_list]
287288
if current_assistant.type == 1:
288-
out_ds_instance: AssistantOutDs = AssistantOutDsFactory.get_instance(current_assistant)
289+
# 构造 AssistantOutDs 会同步请求宿主 API(requests.get,默认 10s 超时),
290+
# 必须在工作线程执行,避免阻塞事件循环导致宿主回调死锁(Issue #1288)
291+
def inner():
292+
return AssistantOutDsFactory.get_instance(current_assistant)
293+
294+
out_ds_instance: AssistantOutDs = await asyncio.to_thread(inner)
289295
return [
290296
{
291297
"id": str(ds.id),

0 commit comments

Comments
 (0)