Skip to content

Commit 9aa51c8

Browse files
committed
refactor(core): implement lazy loading for server module to handle optional dependencies
This change introduces a lazy loading mechanism for the server module to avoid import errors when optional dependencies are not installed. The server-related exports are now imported on-demand through __getattr__, with clear error messages when required optional dependencies are missing. The implementation includes: - TYPE_CHECKING import for type hints during development - Delayed imports wrapped in TYPE_CHECKING blocks - __getattr__ function to handle runtime imports - Clear error messages directing users to install optional dependencies - Server exports defined in _SERVER_EXPORTS set for tracking This resolves issues where the package would fail to import when server optional dependencies were not available. refactor(core): 实现服务器模块的延迟加载以处理可选依赖 此更改引入了服务器模块的延迟加载机制,以避免在未安装可选依赖项时出现导入错误。现在通过 __getattr__ 按需导入服务器相关导出,并在缺少必需的可选依赖项时提供清晰的错误消息。 实现包括: - 用于开发期间类型提示的 TYPE_CHECKING 导入 - 包装在 TYPE_CHECKING 块中的延迟导入 - 用于处理运行时导入的 __getattr__ 函数 - 指向用户安装可选依赖项的清晰错误消息 - 定义在 _SERVER_EXPORTS 集合中用于跟踪的服务器导出 这解决了在服务器可选依赖项不可用时包导入失败的问题。 Change-Id: I9d8f7dd8e5c6d34dfd0619714ead5aea22105293 Signed-off-by: OhYee <[email protected]>
1 parent 4939119 commit 9aa51c8

File tree

1 file changed

+129
-20
lines changed

1 file changed

+129
-20
lines changed

agentrun/__init__.py

Lines changed: 129 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
- Integration: 框架集成 / Framework integration
1717
"""
1818

19+
from typing import TYPE_CHECKING
20+
1921
__version__ = "0.0.8"
2022

2123
# Agent Runtime
@@ -87,27 +89,50 @@
8789
SandboxClient,
8890
Template,
8991
)
90-
# Server
91-
from agentrun.server import (
92-
AgentRequest,
93-
AgentResult,
94-
AgentRunServer,
95-
AsyncInvokeAgentHandler,
96-
InvokeAgentHandler,
97-
Message,
98-
MessageRole,
99-
OpenAIProtocolHandler,
100-
ProtocolHandler,
101-
SyncInvokeAgentHandler,
102-
)
10392
# ToolSet
10493
from agentrun.toolset import ToolSet, ToolSetClient
94+
from agentrun.utils.config import Config
10595
from agentrun.utils.exception import (
10696
ResourceAlreadyExistError,
10797
ResourceNotExistError,
10898
)
10999
from agentrun.utils.model import Status
110100

101+
# Server - 延迟导入以避免可选依赖问题
102+
# Type hints for IDE and type checkers
103+
if TYPE_CHECKING:
104+
from agentrun.server import (
105+
AgentEvent,
106+
AgentEventItem,
107+
AgentRequest,
108+
AgentResult,
109+
AgentResultItem,
110+
AgentReturnType,
111+
AgentRunServer,
112+
AguiEventNormalizer,
113+
AGUIProtocolConfig,
114+
AGUIProtocolHandler,
115+
AsyncAgentEventGenerator,
116+
AsyncAgentResultGenerator,
117+
AsyncInvokeAgentHandler,
118+
BaseProtocolHandler,
119+
EventType,
120+
InvokeAgentHandler,
121+
MergeOptions,
122+
Message,
123+
MessageRole,
124+
OpenAIProtocolConfig,
125+
OpenAIProtocolHandler,
126+
ProtocolConfig,
127+
ProtocolHandler,
128+
ServerConfig,
129+
SyncAgentEventGenerator,
130+
SyncAgentResultGenerator,
131+
SyncInvokeAgentHandler,
132+
Tool,
133+
ToolCall,
134+
)
135+
111136
__all__ = [
112137
######## Agent Runtime ########
113138
# base
@@ -185,22 +210,106 @@
185210
######## ToolSet ########
186211
"ToolSetClient",
187212
"ToolSet",
188-
######## Server ########
213+
######## Server (延迟加载) ########
214+
# Server
189215
"AgentRunServer",
216+
# Config
217+
"ServerConfig",
218+
"ProtocolConfig",
219+
"OpenAIProtocolConfig",
220+
"AGUIProtocolConfig",
221+
# Request/Response Models
190222
"AgentRequest",
191-
"AgentResponse",
223+
"AgentEvent",
192224
"AgentResult",
193-
"AgentStreamResponse",
225+
"Message",
226+
"MessageRole",
227+
"Tool",
228+
"ToolCall",
229+
# Event Types
230+
"EventType",
231+
# Type Aliases
232+
"AgentEventItem",
233+
"AgentResultItem",
234+
"AgentReturnType",
235+
"SyncAgentEventGenerator",
236+
"SyncAgentResultGenerator",
237+
"AsyncAgentEventGenerator",
238+
"AsyncAgentResultGenerator",
194239
"InvokeAgentHandler",
195240
"AsyncInvokeAgentHandler",
196241
"SyncInvokeAgentHandler",
197-
"Message",
198-
"MessageRole",
242+
# Protocol Base
199243
"ProtocolHandler",
244+
"BaseProtocolHandler",
245+
# Protocol - OpenAI
200246
"OpenAIProtocolHandler",
201-
"AgentStreamIterator",
247+
# Protocol - AG-UI
248+
"AGUIProtocolHandler",
249+
# Event Normalizer
250+
"AguiEventNormalizer",
251+
# Helpers
252+
"MergeOptions",
202253
######## Others ########
203-
"Status",
204254
"ResourceNotExistError",
205255
"ResourceAlreadyExistError",
256+
"Config",
206257
]
258+
259+
# Server 模块的所有导出
260+
_SERVER_EXPORTS = {
261+
"AgentRunServer",
262+
"ServerConfig",
263+
"ProtocolConfig",
264+
"OpenAIProtocolConfig",
265+
"AGUIProtocolConfig",
266+
"AgentRequest",
267+
"AgentEvent",
268+
"AgentResult",
269+
"Message",
270+
"MessageRole",
271+
"Tool",
272+
"ToolCall",
273+
"EventType",
274+
"AgentEventItem",
275+
"AgentResultItem",
276+
"AgentReturnType",
277+
"SyncAgentEventGenerator",
278+
"SyncAgentResultGenerator",
279+
"AsyncAgentEventGenerator",
280+
"AsyncAgentResultGenerator",
281+
"InvokeAgentHandler",
282+
"AsyncInvokeAgentHandler",
283+
"SyncInvokeAgentHandler",
284+
"ProtocolHandler",
285+
"BaseProtocolHandler",
286+
"OpenAIProtocolHandler",
287+
"AGUIProtocolHandler",
288+
"AguiEventNormalizer",
289+
"MergeOptions",
290+
}
291+
292+
293+
def __getattr__(name: str):
294+
"""延迟加载 server 模块的导出,避免可选依赖导致导入失败
295+
296+
当用户访问 server 相关的类时,才尝试导入 server 模块。
297+
如果 server 可选依赖未安装,会抛出清晰的错误提示。
298+
"""
299+
if name in _SERVER_EXPORTS:
300+
try:
301+
from agentrun import server
302+
303+
return getattr(server, name)
304+
except ImportError as e:
305+
# 检查是否是缺少可选依赖导致的错误
306+
if "fastapi" in str(e) or "uvicorn" in str(e):
307+
raise ImportError(
308+
f"'{name}' requires the 'server' optional dependencies. "
309+
"Install with: pip install agentrun-sdk[server]\n"
310+
f"Original error: {e}"
311+
) from e
312+
# 其他导入错误继续抛出
313+
raise
314+
315+
raise AttributeError(f"module '{__name__}' has no attribute '{name}'")

0 commit comments

Comments
 (0)