acp-sdk 0.2.0__tar.gz → 0.2.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/PKG-INFO +1 -1
  2. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/examples/clients/advanced.py +3 -1
  3. acp_sdk-0.2.2/examples/clients/session.py +22 -0
  4. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/pyproject.toml +1 -1
  5. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/src/acp_sdk/client/client.py +11 -13
  6. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/src/acp_sdk/models/models.py +4 -4
  7. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/src/acp_sdk/models/schemas.py +2 -4
  8. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/src/acp_sdk/server/app.py +1 -1
  9. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/src/acp_sdk/server/bundle.py +2 -10
  10. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/tests/e2e/test_suites/test_runs.py +3 -3
  11. acp_sdk-0.2.0/examples/clients/session.py +0 -18
  12. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/.gitignore +0 -0
  13. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/.python-version +0 -0
  14. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/README.md +0 -0
  15. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/examples/clients/simple.py +0 -0
  16. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/examples/clients/stream.py +0 -0
  17. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/examples/servers/awaiting.py +0 -0
  18. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/examples/servers/echo.py +0 -0
  19. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/examples/servers/standalone.py +0 -0
  20. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/pytest.ini +0 -0
  21. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/src/acp_sdk/__init__.py +0 -0
  22. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/src/acp_sdk/client/__init__.py +0 -0
  23. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/src/acp_sdk/models/__init__.py +0 -0
  24. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/src/acp_sdk/models/errors.py +0 -0
  25. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/src/acp_sdk/py.typed +0 -0
  26. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/src/acp_sdk/server/__init__.py +0 -0
  27. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/src/acp_sdk/server/agent.py +0 -0
  28. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/src/acp_sdk/server/context.py +0 -0
  29. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/src/acp_sdk/server/errors.py +0 -0
  30. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/src/acp_sdk/server/logging.py +0 -0
  31. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/src/acp_sdk/server/server.py +0 -0
  32. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/src/acp_sdk/server/session.py +0 -0
  33. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/src/acp_sdk/server/telemetry.py +0 -0
  34. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/src/acp_sdk/server/types.py +0 -0
  35. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/src/acp_sdk/server/utils.py +0 -0
  36. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/src/acp_sdk/version.py +0 -0
  37. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/tests/conftest.py +0 -0
  38. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/tests/e2e/__init__.py +0 -0
  39. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/tests/e2e/config.py +0 -0
  40. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/tests/e2e/fixtures/__init__.py +0 -0
  41. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/tests/e2e/fixtures/client.py +0 -0
  42. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/tests/e2e/fixtures/server.py +0 -0
  43. {acp_sdk-0.2.0 → acp_sdk-0.2.2}/tests/e2e/test_suites/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: acp-sdk
3
- Version: 0.2.0
3
+ Version: 0.2.2
4
4
  Summary: Agent Communication Protocol SDK
5
5
  Author: IBM Corp.
6
6
  Maintainer-email: Tomas Pilar <thomas7pilar@gmail.com>
@@ -13,7 +13,9 @@ async def example() -> None:
13
13
  # Additional client configuration
14
14
  )
15
15
  ) as client:
16
- run = await client.run_sync(agent="echo", inputs=[Message(parts=[MessagePart(content="Howdy!")])])
16
+ run = await client.run_sync(
17
+ agent="echo", inputs=[Message(parts=[MessagePart(content="Howdy!", content_type="text/plain")])]
18
+ )
17
19
  print(run)
18
20
 
19
21
 
@@ -0,0 +1,22 @@
1
+ import asyncio
2
+
3
+ from acp_sdk.client import Client
4
+ from acp_sdk.models import (
5
+ Message,
6
+ MessagePart,
7
+ )
8
+
9
+
10
+ async def example() -> None:
11
+ async with Client(base_url="http://localhost:8000") as client, client.session() as session:
12
+ run = await session.run_sync(
13
+ agent="echo", inputs=[Message(parts=[MessagePart(content="Howdy!", content_type="text/plain")])]
14
+ )
15
+ run = await session.run_sync(
16
+ agent="echo", inputs=[Message(parts=[MessagePart(content="Howdy again!", content_type="text/plain")])]
17
+ )
18
+ print(run)
19
+
20
+
21
+ if __name__ == "__main__":
22
+ asyncio.run(example())
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "acp-sdk"
3
- version = "0.2.0"
3
+ version = "0.2.2"
4
4
  description = "Agent Communication Protocol SDK"
5
5
  license = "Apache-2.0"
6
6
  readme = "README.md"
@@ -39,16 +39,14 @@ class Client:
39
39
  base_url: httpx.URL | str = "",
40
40
  session_id: SessionId | None = None,
41
41
  client: httpx.AsyncClient | None = None,
42
+ instrument: bool = True,
42
43
  ) -> None:
43
44
  self.base_url = base_url
44
45
  self.session_id = session_id
45
46
 
46
- self._client = self._init_client(client)
47
-
48
- def _init_client(self, client: httpx.AsyncClient | None = None) -> httpx.AsyncClient:
49
- client = client or httpx.AsyncClient(base_url=self.base_url)
50
- HTTPXClientInstrumentor.instrument_client(client)
51
- return client
47
+ self._client = client or httpx.AsyncClient(base_url=self.base_url)
48
+ if instrument:
49
+ HTTPXClientInstrumentor.instrument_client(self._client)
52
50
 
53
51
  async def __aenter__(self) -> Self:
54
52
  await self._client.__aenter__()
@@ -64,7 +62,7 @@ class Client:
64
62
 
65
63
  @asynccontextmanager
66
64
  async def session(self, session_id: SessionId | None = None) -> AsyncGenerator[Self]:
67
- yield Client(client=self._client, session_id=session_id or uuid.uuid4())
65
+ yield Client(client=self._client, session_id=session_id or uuid.uuid4(), instrument=False)
68
66
 
69
67
  async def agents(self) -> AsyncIterator[Agent]:
70
68
  response = await self._client.get("/agents")
@@ -134,28 +132,28 @@ class Client:
134
132
  self._raise_error(response)
135
133
  return RunCancelResponse.model_validate(response.json())
136
134
 
137
- async def run_resume_sync(self, *, run_id: RunId, await_: AwaitResume) -> Run:
135
+ async def run_resume_sync(self, *, run_id: RunId, await_resume: AwaitResume) -> Run:
138
136
  response = await self._client.post(
139
137
  f"/runs/{run_id}",
140
- json=RunResumeRequest(await_=await_, mode=RunMode.SYNC).model_dump(),
138
+ json=RunResumeRequest(await_resume=await_resume, mode=RunMode.SYNC).model_dump(),
141
139
  )
142
140
  self._raise_error(response)
143
141
  return RunResumeResponse.model_validate(response.json())
144
142
 
145
- async def run_resume_async(self, *, run_id: RunId, await_: AwaitResume) -> Run:
143
+ async def run_resume_async(self, *, run_id: RunId, await_resume: AwaitResume) -> Run:
146
144
  response = await self._client.post(
147
145
  f"/runs/{run_id}",
148
- json=RunResumeRequest(await_=await_, mode=RunMode.ASYNC).model_dump(),
146
+ json=RunResumeRequest(await_resume=await_resume, mode=RunMode.ASYNC).model_dump(),
149
147
  )
150
148
  self._raise_error(response)
151
149
  return RunResumeResponse.model_validate(response.json())
152
150
 
153
- async def run_resume_stream(self, *, run_id: RunId, await_: AwaitResume) -> AsyncIterator[Event]:
151
+ async def run_resume_stream(self, *, run_id: RunId, await_resume: AwaitResume) -> AsyncIterator[Event]:
154
152
  async with aconnect_sse(
155
153
  self._client,
156
154
  "POST",
157
155
  f"/runs/{run_id}",
158
- json=RunResumeRequest(await_=await_, mode=RunMode.STREAM).model_dump(),
156
+ json=RunResumeRequest(await_resume=await_resume, mode=RunMode.STREAM).model_dump(),
159
157
  ) as event_source:
160
158
  async for event in self._validate_stream(event_source):
161
159
  yield event
@@ -113,9 +113,9 @@ class MessageCompletedEvent(BaseModel):
113
113
  message: Message
114
114
 
115
115
 
116
- class AwaitEvent(BaseModel):
117
- type: Literal["await"] = "await"
118
- await_request: AwaitRequest | None = None
116
+ class RunAwaitingEvent(BaseModel):
117
+ type: Literal["run.awaiting"] = "run.awaiting"
118
+ run: Run
119
119
 
120
120
 
121
121
  class GenericEvent(BaseModel):
@@ -155,7 +155,7 @@ Event = Union[
155
155
  ArtifactEvent,
156
156
  MessagePartEvent,
157
157
  MessageCompletedEvent,
158
- AwaitEvent,
158
+ RunAwaitingEvent,
159
159
  GenericEvent,
160
160
  RunCancelledEvent,
161
161
  RunFailedEvent,
@@ -1,4 +1,4 @@
1
- from pydantic import BaseModel, ConfigDict, Field
1
+ from pydantic import BaseModel
2
2
 
3
3
  from acp_sdk.models.models import Agent, AgentName, AwaitResume, Message, Run, RunMode, SessionId
4
4
 
@@ -23,11 +23,9 @@ class RunCreateResponse(Run):
23
23
 
24
24
 
25
25
  class RunResumeRequest(BaseModel):
26
- await_: AwaitResume = Field(alias="await")
26
+ await_resume: AwaitResume
27
27
  mode: RunMode
28
28
 
29
- model_config = ConfigDict(populate_by_name=True)
30
-
31
29
 
32
30
  class RunResumeResponse(Run):
33
31
  pass
@@ -144,7 +144,7 @@ def create_app(*agents: Agent) -> FastAPI:
144
144
  @app.post("/runs/{run_id}")
145
145
  async def resume_run(run_id: RunId, request: RunResumeRequest) -> RunResumeResponse:
146
146
  bundle = find_run_bundle(run_id)
147
- await bundle.resume(request.await_)
147
+ await bundle.resume(request.await_resume)
148
148
  match request.mode:
149
149
  case RunMode.STREAM:
150
150
  return StreamingResponse(
@@ -7,7 +7,6 @@ from pydantic import ValidationError
7
7
 
8
8
  from acp_sdk.models import (
9
9
  AnyModel,
10
- AwaitEvent,
11
10
  AwaitRequest,
12
11
  AwaitResume,
13
12
  Error,
@@ -17,6 +16,7 @@ from acp_sdk.models import (
17
16
  MessageCreatedEvent,
18
17
  MessagePartEvent,
19
18
  Run,
19
+ RunAwaitingEvent,
20
20
  RunCancelledEvent,
21
21
  RunCompletedEvent,
22
22
  RunCreatedEvent,
@@ -120,15 +120,7 @@ class RunBundle:
120
120
  elif isinstance(next, AwaitRequest):
121
121
  self.run.await_request = next
122
122
  self.run.status = RunStatus.AWAITING
123
- await self.emit(
124
- AwaitEvent.model_validate(
125
- {
126
- "run_id": self.run.run_id,
127
- "type": "await",
128
- "await": next,
129
- }
130
- )
131
- )
123
+ await self.emit(RunAwaitingEvent(run=self.run))
132
124
  run_logger.info("Run awaited")
133
125
  await_resume = await self.await_()
134
126
  await self.emit(RunInProgressEvent(run=self.run))
@@ -66,7 +66,7 @@ async def test_run_resume_sync(server: Server, client: Client) -> None:
66
66
  assert run.status == RunStatus.AWAITING
67
67
  assert run.await_request is not None
68
68
 
69
- run = await client.run_resume_sync(run_id=run.run_id, await_=AwaitResume())
69
+ run = await client.run_resume_sync(run_id=run.run_id, await_resume=AwaitResume())
70
70
  assert run.status == RunStatus.COMPLETED
71
71
 
72
72
 
@@ -76,7 +76,7 @@ async def test_run_resume_async(server: Server, client: Client) -> None:
76
76
  assert run.status == RunStatus.AWAITING
77
77
  assert run.await_request is not None
78
78
 
79
- run = await client.run_resume_async(run_id=run.run_id, await_=AwaitResume())
79
+ run = await client.run_resume_async(run_id=run.run_id, await_resume=AwaitResume())
80
80
  assert run.status == RunStatus.IN_PROGRESS
81
81
 
82
82
 
@@ -86,7 +86,7 @@ async def test_run_resume_stream(server: Server, client: Client) -> None:
86
86
  assert run.status == RunStatus.AWAITING
87
87
  assert run.await_request is not None
88
88
 
89
- event_stream = [event async for event in client.run_resume_stream(run_id=run.run_id, await_=AwaitResume())]
89
+ event_stream = [event async for event in client.run_resume_stream(run_id=run.run_id, await_resume=AwaitResume())]
90
90
  assert isinstance(event_stream[0], RunInProgressEvent)
91
91
  assert isinstance(event_stream[-1], RunCompletedEvent)
92
92
 
@@ -1,18 +0,0 @@
1
- import asyncio
2
-
3
- from acp_sdk.client import Client
4
- from acp_sdk.models import (
5
- Message,
6
- MessagePart,
7
- )
8
-
9
-
10
- async def example() -> None:
11
- async with Client(base_url="http://localhost:8000") as client, client.session() as session:
12
- run = await session.run_sync(agent="echo", inputs=[Message(parts=[MessagePart(content="Howdy!")])])
13
- run = await session.run_sync(agent="echo", inputs=[Message(parts=[MessagePart(content="Howdy again!")])])
14
- print(run)
15
-
16
-
17
- if __name__ == "__main__":
18
- asyncio.run(example())
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes