Skip to content

Commit f1286e6

Browse files
author
Chojan Shang
committed
feat: update examples
Signed-off-by: Chojan Shang <chojan.shang@vesoft.com>
1 parent a9a33f3 commit f1286e6

File tree

2 files changed

+51
-40
lines changed

2 files changed

+51
-40
lines changed

examples/agent.py

Lines changed: 19 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -24,69 +24,60 @@
2424
update_agent_message,
2525
PROTOCOL_VERSION,
2626
)
27-
from acp.schema import AgentCapabilities, McpCapabilities, PromptCapabilities
27+
from acp.schema import AgentCapabilities, AgentMessageChunk, Implementation
2828

2929

3030
class ExampleAgent(Agent):
3131
def __init__(self, conn: AgentSideConnection) -> None:
3232
self._conn = conn
3333
self._next_session_id = 0
34+
self._sessions: set[str] = set()
3435

35-
async def _send_chunk(self, session_id: str, content: Any) -> None:
36-
await self._conn.sessionUpdate(
37-
session_notification(
38-
session_id,
39-
update_agent_message(content),
40-
)
41-
)
36+
async def _send_agent_message(self, session_id: str, content: Any) -> None:
37+
update = content if isinstance(content, AgentMessageChunk) else update_agent_message(content)
38+
await self._conn.sessionUpdate(session_notification(session_id, update))
4239

4340
async def initialize(self, params: InitializeRequest) -> InitializeResponse: # noqa: ARG002
4441
logging.info("Received initialize request")
45-
mcp_caps: McpCapabilities = McpCapabilities(http=False, sse=False)
46-
prompt_caps: PromptCapabilities = PromptCapabilities(audio=False, embeddedContext=False, image=False)
47-
agent_caps: AgentCapabilities = AgentCapabilities(
48-
loadSession=False,
49-
mcpCapabilities=mcp_caps,
50-
promptCapabilities=prompt_caps,
51-
)
5242
return InitializeResponse(
5343
protocolVersion=PROTOCOL_VERSION,
54-
agentCapabilities=agent_caps,
44+
agentCapabilities=AgentCapabilities(),
45+
agentInfo=Implementation(name="example-agent", title="Example Agent", version="0.1.0"),
5546
)
5647

5748
async def authenticate(self, params: AuthenticateRequest) -> AuthenticateResponse | None: # noqa: ARG002
58-
logging.info("Received authenticate request")
49+
logging.info("Received authenticate request %s", params.methodId)
5950
return AuthenticateResponse()
6051

6152
async def newSession(self, params: NewSessionRequest) -> NewSessionResponse: # noqa: ARG002
6253
logging.info("Received new session request")
6354
session_id = str(self._next_session_id)
6455
self._next_session_id += 1
65-
return NewSessionResponse(sessionId=session_id)
56+
self._sessions.add(session_id)
57+
return NewSessionResponse(sessionId=session_id, modes=None)
6658

6759
async def loadSession(self, params: LoadSessionRequest) -> LoadSessionResponse | None: # noqa: ARG002
68-
logging.info("Received load session request")
60+
logging.info("Received load session request %s", params.sessionId)
61+
self._sessions.add(params.sessionId)
6962
return LoadSessionResponse()
7063

7164
async def setSessionMode(self, params: SetSessionModeRequest) -> SetSessionModeResponse | None: # noqa: ARG002
72-
logging.info("Received set session mode request")
65+
logging.info("Received set session mode request %s -> %s", params.sessionId, params.modeId)
7366
return SetSessionModeResponse()
7467

7568
async def prompt(self, params: PromptRequest) -> PromptResponse:
76-
logging.info("Received prompt request")
69+
logging.info("Received prompt request for session %s", params.sessionId)
70+
if params.sessionId not in self._sessions:
71+
self._sessions.add(params.sessionId)
7772

78-
# Notify the client what it just sent and then echo each content block back.
79-
await self._send_chunk(
80-
params.sessionId,
81-
text_block("Client sent:"),
82-
)
73+
await self._send_agent_message(params.sessionId, text_block("Client sent:"))
8374
for block in params.prompt:
84-
await self._send_chunk(params.sessionId, block)
75+
await self._send_agent_message(params.sessionId, block)
8576

8677
return PromptResponse(stopReason="end_turn")
8778

8879
async def cancel(self, params: CancelNotification) -> None: # noqa: ARG002
89-
logging.info("Received cancel notification")
80+
logging.info("Received cancel notification for session %s", params.sessionId)
9081

9182
async def extMethod(self, method: str, params: dict) -> dict: # noqa: ARG002
9283
logging.info("Received extension method call: %s", method)

examples/client.py

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,16 @@
1717
text_block,
1818
PROTOCOL_VERSION,
1919
)
20+
from acp.schema import (
21+
AgentMessageChunk,
22+
AudioContentBlock,
23+
ClientCapabilities,
24+
EmbeddedResourceContentBlock,
25+
ImageContentBlock,
26+
Implementation,
27+
ResourceContentBlock,
28+
TextContentBlock,
29+
)
2030

2131

2232
class ExampleClient(Client):
@@ -46,20 +56,24 @@ async def killTerminal(self, params): # type: ignore[override]
4656

4757
async def sessionUpdate(self, params: SessionNotification) -> None:
4858
update = params.update
49-
if isinstance(update, dict):
50-
kind = update.get("sessionUpdate")
51-
content = update.get("content")
52-
else:
53-
kind = getattr(update, "sessionUpdate", None)
54-
content = getattr(update, "content", None)
55-
56-
if kind != "agent_message_chunk" or content is None:
59+
if not isinstance(update, AgentMessageChunk):
5760
return
5861

59-
if isinstance(content, dict):
60-
text = content.get("text", "<content>")
62+
content = update.content
63+
text: str
64+
if isinstance(content, TextContentBlock):
65+
text = content.text
66+
elif isinstance(content, ImageContentBlock):
67+
text = "<image>"
68+
elif isinstance(content, AudioContentBlock):
69+
text = "<audio>"
70+
elif isinstance(content, ResourceContentBlock):
71+
text = content.uri or "<resource>"
72+
elif isinstance(content, EmbeddedResourceContentBlock):
73+
text = "<resource>"
6174
else:
62-
text = getattr(content, "text", "<content>")
75+
text = "<content>"
76+
6377
print(f"| Agent: {text}")
6478

6579
async def extMethod(self, method: str, params: dict) -> dict: # noqa: ARG002
@@ -130,7 +144,13 @@ async def main(argv: list[str]) -> int:
130144
client_impl = ExampleClient()
131145
conn = ClientSideConnection(lambda _agent: client_impl, proc.stdin, proc.stdout)
132146

133-
await conn.initialize(InitializeRequest(protocolVersion=PROTOCOL_VERSION, clientCapabilities=None))
147+
await conn.initialize(
148+
InitializeRequest(
149+
protocolVersion=PROTOCOL_VERSION,
150+
clientCapabilities=ClientCapabilities(),
151+
clientInfo=Implementation(name="example-client", title="Example Client", version="0.1.0"),
152+
)
153+
)
134154
session = await conn.newSession(NewSessionRequest(mcpServers=[], cwd=os.getcwd()))
135155

136156
await interactive_loop(conn, session.sessionId)

0 commit comments

Comments
 (0)