Skip to content

Commit 0da09a3

Browse files
author
Chojan Shang
committed
feat: intro router to manager handlers
Signed-off-by: Chojan Shang <chojan.shang@vesoft.com>
1 parent fa007f9 commit 0da09a3

7 files changed

Lines changed: 378 additions & 210 deletions

File tree

src/acp/agent/connection.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
)
2929
from ..terminal import TerminalHandle
3030
from ..utils import notify_model, request_model, request_optional_model
31-
from .handlers import dispatch_agent_method
31+
from .router import build_agent_router
3232

3333
__all__ = ["AgentSideConnection"]
3434

@@ -52,8 +52,13 @@ def __init__(
5252
self._conn = Connection(handler, input_stream, output_stream)
5353

5454
def _create_handler(self, agent: Agent) -> MethodHandler:
55+
router = build_agent_router(agent)
56+
5557
async def handler(method: str, params: Any | None, is_notification: bool) -> Any:
56-
return await dispatch_agent_method(agent, method, params, is_notification)
58+
if is_notification:
59+
await router.dispatch_notification(method, params)
60+
return None
61+
return await router.dispatch_request(method, params)
5762

5863
return handler
5964

src/acp/agent/handlers.py

Lines changed: 0 additions & 104 deletions
This file was deleted.

src/acp/agent/router.py

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
from __future__ import annotations
2+
3+
from typing import Any
4+
5+
from ..exceptions import RequestError
6+
from ..interfaces import Agent
7+
from ..meta import AGENT_METHODS
8+
from ..router import MessageRouter, RouterBuilder
9+
from ..schema import (
10+
AuthenticateRequest,
11+
CancelNotification,
12+
InitializeRequest,
13+
LoadSessionRequest,
14+
NewSessionRequest,
15+
PromptRequest,
16+
SetSessionModelRequest,
17+
SetSessionModeRequest,
18+
)
19+
from ..utils import normalize_result
20+
21+
__all__ = ["build_agent_router"]
22+
23+
24+
def build_agent_router(agent: Agent) -> MessageRouter:
25+
builder = RouterBuilder()
26+
27+
builder.request_attr(AGENT_METHODS["initialize"], InitializeRequest, agent, "initialize")
28+
builder.request_attr(AGENT_METHODS["session_new"], NewSessionRequest, agent, "newSession")
29+
builder.request_attr(
30+
AGENT_METHODS["session_load"],
31+
LoadSessionRequest,
32+
agent,
33+
"loadSession",
34+
adapt_result=normalize_result,
35+
)
36+
builder.request_attr(
37+
AGENT_METHODS["session_set_mode"],
38+
SetSessionModeRequest,
39+
agent,
40+
"setSessionMode",
41+
adapt_result=normalize_result,
42+
)
43+
builder.request_attr(AGENT_METHODS["session_prompt"], PromptRequest, agent, "prompt")
44+
builder.request_attr(
45+
AGENT_METHODS["session_set_model"],
46+
SetSessionModelRequest,
47+
agent,
48+
"setSessionModel",
49+
adapt_result=normalize_result,
50+
)
51+
builder.request_attr(
52+
AGENT_METHODS["authenticate"],
53+
AuthenticateRequest,
54+
agent,
55+
"authenticate",
56+
adapt_result=normalize_result,
57+
)
58+
59+
builder.notification_attr(AGENT_METHODS["session_cancel"], CancelNotification, agent, "cancel")
60+
61+
async def handle_extension_request(name: str, payload: dict[str, Any]) -> Any:
62+
ext = getattr(agent, "extMethod", None)
63+
if ext is None:
64+
raise RequestError.method_not_found(f"_{name}")
65+
return await ext(name, payload)
66+
67+
async def handle_extension_notification(name: str, payload: dict[str, Any]) -> None:
68+
ext = getattr(agent, "extNotification", None)
69+
if ext is None:
70+
return
71+
await ext(name, payload)
72+
73+
return builder.build(
74+
request_extensions=handle_extension_request,
75+
notification_extensions=handle_extension_notification,
76+
)

src/acp/client/connection.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
request_model,
3030
request_model_from_dict,
3131
)
32-
from .handlers import dispatch_client_method
32+
from .router import build_client_router
3333

3434
__all__ = ["ClientSideConnection"]
3535

@@ -53,8 +53,13 @@ def __init__(
5353
self._conn = Connection(handler, input_stream, output_stream)
5454

5555
def _create_handler(self, client: Client) -> MethodHandler:
56+
router = build_client_router(client)
57+
5658
async def handler(method: str, params: Any | None, is_notification: bool) -> Any:
57-
return await dispatch_client_method(client, method, params, is_notification)
59+
if is_notification:
60+
await router.dispatch_notification(method, params)
61+
return None
62+
return await router.dispatch_request(method, params)
5863

5964
return handler
6065

src/acp/client/handlers.py

Lines changed: 0 additions & 102 deletions
This file was deleted.

0 commit comments

Comments
 (0)