acp-sdk 0.8.4__py3-none-any.whl → 0.9.1__py3-none-any.whl
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.
- acp_sdk/client/client.py +5 -6
- acp_sdk/models/models.py +6 -0
- acp_sdk/server/app.py +9 -6
- acp_sdk/server/bundle.py +4 -0
- acp_sdk/server/server.py +153 -16
- acp_sdk/server/telemetry.py +6 -2
- {acp_sdk-0.8.4.dist-info → acp_sdk-0.9.1.dist-info}/METADATA +2 -2
- {acp_sdk-0.8.4.dist-info → acp_sdk-0.9.1.dist-info}/RECORD +9 -9
- {acp_sdk-0.8.4.dist-info → acp_sdk-0.9.1.dist-info}/WHEEL +0 -0
acp_sdk/client/client.py
CHANGED
@@ -8,7 +8,6 @@ from typing import Self
|
|
8
8
|
|
9
9
|
import httpx
|
10
10
|
from httpx_sse import EventSource, aconnect_sse
|
11
|
-
from opentelemetry.instrumentation.httpx import HTTPXClientInstrumentor
|
12
11
|
from pydantic import TypeAdapter
|
13
12
|
|
14
13
|
from acp_sdk.client.types import Input
|
@@ -22,6 +21,7 @@ from acp_sdk.models import (
|
|
22
21
|
AgentsListResponse,
|
23
22
|
AwaitResume,
|
24
23
|
Error,
|
24
|
+
ErrorEvent,
|
25
25
|
Event,
|
26
26
|
PingResponse,
|
27
27
|
Run,
|
@@ -43,7 +43,6 @@ class Client:
|
|
43
43
|
*,
|
44
44
|
session_id: SessionId | None = None,
|
45
45
|
client: httpx.AsyncClient | None = None,
|
46
|
-
instrument: bool = True,
|
47
46
|
auth: httpx._types.AuthTypes | None = None,
|
48
47
|
params: httpx._types.QueryParamTypes | None = None,
|
49
48
|
headers: httpx._types.HeaderTypes | None = None,
|
@@ -84,8 +83,6 @@ class Client:
|
|
84
83
|
transport=transport,
|
85
84
|
trust_env=trust_env,
|
86
85
|
)
|
87
|
-
if instrument:
|
88
|
-
HTTPXClientInstrumentor.instrument_client(self._client)
|
89
86
|
|
90
87
|
@property
|
91
88
|
def client(self) -> httpx.AsyncClient:
|
@@ -107,7 +104,7 @@ class Client:
|
|
107
104
|
async def session(self, session_id: SessionId | None = None) -> AsyncGenerator[Self]:
|
108
105
|
session_id = session_id or uuid.uuid4()
|
109
106
|
with get_tracer().start_as_current_span("session", attributes={"acp.session": str(session_id)}):
|
110
|
-
yield Client(client=self._client, session_id=session_id
|
107
|
+
yield Client(client=self._client, session_id=session_id)
|
111
108
|
|
112
109
|
async def agents(self) -> AsyncIterator[Agent]:
|
113
110
|
response = await self._client.get("/agents")
|
@@ -224,7 +221,9 @@ class Client:
|
|
224
221
|
await event_source.response.aread()
|
225
222
|
self._raise_error(event_source.response)
|
226
223
|
async for event in event_source.aiter_sse():
|
227
|
-
event = TypeAdapter(Event).validate_json(event.data)
|
224
|
+
event: Event = TypeAdapter(Event).validate_json(event.data)
|
225
|
+
if isinstance(event, ErrorEvent):
|
226
|
+
raise ACPError(error=event.error)
|
228
227
|
yield event
|
229
228
|
|
230
229
|
def _raise_error(self, response: httpx.Response) -> None:
|
acp_sdk/models/models.py
CHANGED
@@ -262,7 +262,13 @@ class RunCompletedEvent(BaseModel):
|
|
262
262
|
run: Run
|
263
263
|
|
264
264
|
|
265
|
+
class ErrorEvent(BaseModel):
|
266
|
+
type: Literal["error"] = "error"
|
267
|
+
error: Error
|
268
|
+
|
269
|
+
|
265
270
|
Event = Union[
|
271
|
+
ErrorEvent,
|
266
272
|
RunCreatedEvent,
|
267
273
|
RunInProgressEvent,
|
268
274
|
MessageCreatedEvent,
|
acp_sdk/server/app.py
CHANGED
@@ -6,9 +6,9 @@ from enum import Enum
|
|
6
6
|
|
7
7
|
from cachetools import TTLCache
|
8
8
|
from fastapi import Depends, FastAPI, HTTPException, status
|
9
|
+
from fastapi.applications import AppType, Lifespan
|
9
10
|
from fastapi.encoders import jsonable_encoder
|
10
11
|
from fastapi.responses import JSONResponse, StreamingResponse
|
11
|
-
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
|
12
12
|
|
13
13
|
from acp_sdk.models import (
|
14
14
|
Agent as AgentModel,
|
@@ -53,24 +53,27 @@ def create_app(
|
|
53
53
|
*agents: Agent,
|
54
54
|
run_limit: int = 1000,
|
55
55
|
run_ttl: timedelta = timedelta(hours=1),
|
56
|
+
lifespan: Lifespan[AppType] | None = None,
|
56
57
|
dependencies: list[Depends] | None = None,
|
57
58
|
) -> FastAPI:
|
58
59
|
executor: ThreadPoolExecutor
|
59
60
|
|
60
61
|
@asynccontextmanager
|
61
|
-
async def
|
62
|
+
async def internal_lifespan(app: FastAPI) -> AsyncGenerator[None]:
|
62
63
|
nonlocal executor
|
63
64
|
with ThreadPoolExecutor() as exec:
|
64
65
|
executor = exec
|
65
|
-
|
66
|
+
if not lifespan:
|
67
|
+
yield None
|
68
|
+
else:
|
69
|
+
async with lifespan(app) as state:
|
70
|
+
yield state
|
66
71
|
|
67
72
|
app = FastAPI(
|
68
|
-
lifespan=
|
73
|
+
lifespan=internal_lifespan,
|
69
74
|
dependencies=dependencies,
|
70
75
|
)
|
71
76
|
|
72
|
-
FastAPIInstrumentor.instrument_app(app)
|
73
|
-
|
74
77
|
agents: dict[AgentName, Agent] = {agent.name: agent for agent in agents}
|
75
78
|
runs: TTLCache[RunId, RunBundle] = TTLCache(maxsize=run_limit, ttl=run_ttl, timer=datetime.now)
|
76
79
|
sessions: TTLCache[SessionId, Session] = TTLCache(maxsize=run_limit, ttl=run_ttl, timer=datetime.now)
|
acp_sdk/server/bundle.py
CHANGED
@@ -142,6 +142,8 @@ class RunBundle:
|
|
142
142
|
run_logger.info("Run resumed")
|
143
143
|
elif isinstance(next, Error):
|
144
144
|
raise ACPError(error=next)
|
145
|
+
elif isinstance(next, ACPError):
|
146
|
+
raise next
|
145
147
|
elif next is None:
|
146
148
|
await flush_message()
|
147
149
|
elif isinstance(next, BaseModel):
|
@@ -176,3 +178,5 @@ class RunBundle:
|
|
176
178
|
finally:
|
177
179
|
self.await_or_terminate_event.set()
|
178
180
|
await self.stream_queue.put(None)
|
181
|
+
if not self.task.done():
|
182
|
+
self.task.cancel()
|
acp_sdk/server/server.py
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
import asyncio
|
2
2
|
import os
|
3
|
-
from collections.abc import Awaitable
|
3
|
+
from collections.abc import AsyncGenerator, Awaitable
|
4
|
+
from contextlib import asynccontextmanager
|
4
5
|
from datetime import timedelta
|
5
6
|
from typing import Any, Callable
|
6
7
|
|
7
8
|
import requests
|
8
9
|
import uvicorn
|
9
10
|
import uvicorn.config
|
11
|
+
from fastapi import FastAPI
|
10
12
|
|
11
13
|
from acp_sdk.models import Metadata
|
12
14
|
from acp_sdk.server.agent import Agent
|
@@ -20,8 +22,8 @@ from acp_sdk.server.utils import async_request_with_retry
|
|
20
22
|
|
21
23
|
class Server:
|
22
24
|
def __init__(self) -> None:
|
23
|
-
self.
|
24
|
-
self.
|
25
|
+
self.agents: list[Agent] = []
|
26
|
+
self.server: uvicorn.Server | None = None
|
25
27
|
|
26
28
|
def agent(
|
27
29
|
self,
|
@@ -40,10 +42,15 @@ class Server:
|
|
40
42
|
return decorator
|
41
43
|
|
42
44
|
def register(self, *agents: Agent) -> None:
|
43
|
-
self.
|
45
|
+
self.agents.extend(agents)
|
44
46
|
|
45
|
-
|
47
|
+
@asynccontextmanager
|
48
|
+
async def lifespan(self, app: FastAPI) -> AsyncGenerator[None]:
|
49
|
+
yield
|
50
|
+
|
51
|
+
async def serve(
|
46
52
|
self,
|
53
|
+
*,
|
47
54
|
configure_logger: bool = True,
|
48
55
|
configure_telemetry: bool = False,
|
49
56
|
self_registration: bool = True,
|
@@ -101,18 +108,25 @@ class Server:
|
|
101
108
|
factory: bool = False,
|
102
109
|
h11_max_incomplete_event_size: int | None = None,
|
103
110
|
) -> None:
|
104
|
-
if self.
|
111
|
+
if self.server:
|
105
112
|
raise RuntimeError("The server is already running")
|
106
113
|
|
114
|
+
if headers is None:
|
115
|
+
headers = [("server", "acp")]
|
116
|
+
elif not any(k.lower() == "server" for k, _ in headers):
|
117
|
+
headers.append(("server", "acp"))
|
118
|
+
|
107
119
|
import uvicorn
|
108
120
|
|
121
|
+
app = create_app(*self.agents, lifespan=self.lifespan, run_limit=run_limit, run_ttl=run_ttl)
|
122
|
+
|
109
123
|
if configure_logger:
|
110
124
|
configure_logger_func()
|
111
125
|
if configure_telemetry:
|
112
|
-
configure_telemetry_func()
|
126
|
+
configure_telemetry_func(app)
|
113
127
|
|
114
128
|
config = uvicorn.Config(
|
115
|
-
|
129
|
+
app,
|
116
130
|
host,
|
117
131
|
port,
|
118
132
|
uds,
|
@@ -161,23 +175,139 @@ class Server:
|
|
161
175
|
factory,
|
162
176
|
h11_max_incomplete_event_size,
|
163
177
|
)
|
164
|
-
self.
|
178
|
+
self.server = uvicorn.Server(config)
|
179
|
+
await self._serve(self_registration=self_registration)
|
165
180
|
|
166
|
-
|
181
|
+
def run(
|
182
|
+
self,
|
183
|
+
*,
|
184
|
+
configure_logger: bool = True,
|
185
|
+
configure_telemetry: bool = False,
|
186
|
+
self_registration: bool = True,
|
187
|
+
run_limit: int = 1000,
|
188
|
+
run_ttl: timedelta = timedelta(hours=1),
|
189
|
+
host: str = "127.0.0.1",
|
190
|
+
port: int = 8000,
|
191
|
+
uds: str | None = None,
|
192
|
+
fd: int | None = None,
|
193
|
+
loop: uvicorn.config.LoopSetupType = "auto",
|
194
|
+
http: type[asyncio.Protocol] | uvicorn.config.HTTPProtocolType = "auto",
|
195
|
+
ws: type[asyncio.Protocol] | uvicorn.config.WSProtocolType = "auto",
|
196
|
+
ws_max_size: int = 16 * 1024 * 1024,
|
197
|
+
ws_max_queue: int = 32,
|
198
|
+
ws_ping_interval: float | None = 20.0,
|
199
|
+
ws_ping_timeout: float | None = 20.0,
|
200
|
+
ws_per_message_deflate: bool = True,
|
201
|
+
lifespan: uvicorn.config.LifespanType = "auto",
|
202
|
+
env_file: str | os.PathLike[str] | None = None,
|
203
|
+
log_config: dict[str, Any]
|
204
|
+
| str
|
205
|
+
| uvicorn.config.RawConfigParser
|
206
|
+
| uvicorn.config.IO[Any]
|
207
|
+
| None = uvicorn.config.LOGGING_CONFIG,
|
208
|
+
log_level: str | int | None = None,
|
209
|
+
access_log: bool = True,
|
210
|
+
use_colors: bool | None = None,
|
211
|
+
interface: uvicorn.config.InterfaceType = "auto",
|
212
|
+
reload: bool = False,
|
213
|
+
reload_dirs: list[str] | str | None = None,
|
214
|
+
reload_delay: float = 0.25,
|
215
|
+
reload_includes: list[str] | str | None = None,
|
216
|
+
reload_excludes: list[str] | str | None = None,
|
217
|
+
workers: int | None = None,
|
218
|
+
proxy_headers: bool = True,
|
219
|
+
server_header: bool = True,
|
220
|
+
date_header: bool = True,
|
221
|
+
forwarded_allow_ips: list[str] | str | None = None,
|
222
|
+
root_path: str = "",
|
223
|
+
limit_concurrency: int | None = None,
|
224
|
+
limit_max_requests: int | None = None,
|
225
|
+
backlog: int = 2048,
|
226
|
+
timeout_keep_alive: int = 5,
|
227
|
+
timeout_notify: int = 30,
|
228
|
+
timeout_graceful_shutdown: int | None = None,
|
229
|
+
callback_notify: Callable[..., Awaitable[None]] | None = None,
|
230
|
+
ssl_keyfile: str | os.PathLike[str] | None = None,
|
231
|
+
ssl_certfile: str | os.PathLike[str] | None = None,
|
232
|
+
ssl_keyfile_password: str | None = None,
|
233
|
+
ssl_version: int = uvicorn.config.SSL_PROTOCOL_VERSION,
|
234
|
+
ssl_cert_reqs: int = uvicorn.config.ssl.CERT_NONE,
|
235
|
+
ssl_ca_certs: str | None = None,
|
236
|
+
ssl_ciphers: str = "TLSv1",
|
237
|
+
headers: list[tuple[str, str]] | None = None,
|
238
|
+
factory: bool = False,
|
239
|
+
h11_max_incomplete_event_size: int | None = None,
|
240
|
+
) -> None:
|
241
|
+
asyncio.run(
|
242
|
+
self.serve(
|
243
|
+
configure_logger=configure_logger,
|
244
|
+
configure_telemetry=configure_telemetry,
|
245
|
+
self_registration=self_registration,
|
246
|
+
run_limit=run_limit,
|
247
|
+
run_ttl=run_ttl,
|
248
|
+
host=host,
|
249
|
+
port=port,
|
250
|
+
uds=uds,
|
251
|
+
fd=fd,
|
252
|
+
loop=loop,
|
253
|
+
http=http,
|
254
|
+
ws=ws,
|
255
|
+
ws_max_size=ws_max_size,
|
256
|
+
ws_max_queue=ws_max_queue,
|
257
|
+
ws_ping_interval=ws_ping_interval,
|
258
|
+
ws_ping_timeout=ws_ping_timeout,
|
259
|
+
ws_per_message_deflate=ws_per_message_deflate,
|
260
|
+
lifespan=lifespan,
|
261
|
+
env_file=env_file,
|
262
|
+
log_config=log_config,
|
263
|
+
log_level=log_level,
|
264
|
+
access_log=access_log,
|
265
|
+
use_colors=use_colors,
|
266
|
+
interface=interface,
|
267
|
+
reload=reload,
|
268
|
+
reload_dirs=reload_dirs,
|
269
|
+
reload_delay=reload_delay,
|
270
|
+
reload_includes=reload_includes,
|
271
|
+
reload_excludes=reload_excludes,
|
272
|
+
workers=workers,
|
273
|
+
proxy_headers=proxy_headers,
|
274
|
+
server_header=server_header,
|
275
|
+
date_header=date_header,
|
276
|
+
forwarded_allow_ips=forwarded_allow_ips,
|
277
|
+
root_path=root_path,
|
278
|
+
limit_concurrency=limit_concurrency,
|
279
|
+
limit_max_requests=limit_max_requests,
|
280
|
+
backlog=backlog,
|
281
|
+
timeout_keep_alive=timeout_keep_alive,
|
282
|
+
timeout_notify=timeout_notify,
|
283
|
+
timeout_graceful_shutdown=timeout_graceful_shutdown,
|
284
|
+
callback_notify=callback_notify,
|
285
|
+
ssl_keyfile=ssl_keyfile,
|
286
|
+
ssl_certfile=ssl_certfile,
|
287
|
+
ssl_keyfile_password=ssl_keyfile_password,
|
288
|
+
ssl_version=ssl_version,
|
289
|
+
ssl_cert_reqs=ssl_cert_reqs,
|
290
|
+
ssl_ca_certs=ssl_ca_certs,
|
291
|
+
ssl_ciphers=ssl_ciphers,
|
292
|
+
headers=headers,
|
293
|
+
factory=factory,
|
294
|
+
h11_max_incomplete_event_size=h11_max_incomplete_event_size,
|
295
|
+
)
|
296
|
+
)
|
167
297
|
|
168
298
|
async def _serve(self, self_registration: bool = True) -> None:
|
169
299
|
registration_task = asyncio.create_task(self._register_agent()) if self_registration else None
|
170
|
-
await self.
|
300
|
+
await self.server.serve()
|
171
301
|
if registration_task:
|
172
302
|
registration_task.cancel()
|
173
303
|
|
174
304
|
@property
|
175
305
|
def should_exit(self) -> bool:
|
176
|
-
return self.
|
306
|
+
return self.server.should_exit if self.server else False
|
177
307
|
|
178
308
|
@should_exit.setter
|
179
309
|
def should_exit(self, value: bool) -> None:
|
180
|
-
self.
|
310
|
+
self.server.should_exit = value
|
181
311
|
|
182
312
|
async def _register_agent(self) -> None:
|
183
313
|
"""If not in PRODUCTION mode, register agent to the beeai platform and provide missing env variables"""
|
@@ -187,7 +317,7 @@ class Server:
|
|
187
317
|
|
188
318
|
url = os.getenv("PLATFORM_URL", "http://127.0.0.1:8333")
|
189
319
|
request_data = {
|
190
|
-
"location": f"http://{self.
|
320
|
+
"location": f"http://{self.server.config.host}:{self.server.config.port}",
|
191
321
|
}
|
192
322
|
try:
|
193
323
|
await async_request_with_retry(
|
@@ -198,7 +328,7 @@ class Server:
|
|
198
328
|
# check missing env keyes
|
199
329
|
envs_request = await async_request_with_retry(lambda client: client.get(f"{url}/api/v1/variables"))
|
200
330
|
envs = envs_request.get("env")
|
201
|
-
for agent in self.
|
331
|
+
for agent in self.agents:
|
202
332
|
# register all available envs
|
203
333
|
missing_keyes = []
|
204
334
|
for env in agent.metadata.model_dump().get("env", []):
|
@@ -215,4 +345,11 @@ class Server:
|
|
215
345
|
except requests.exceptions.ConnectionError as e:
|
216
346
|
logger.warning(f"Can not reach server, check if running on {url} : {e}")
|
217
347
|
except (requests.exceptions.HTTPError, Exception) as e:
|
218
|
-
|
348
|
+
try:
|
349
|
+
error_message = e.response.json().get("detail")
|
350
|
+
if error_message:
|
351
|
+
logger.warning(f"Agent can not be registered to beeai server: {error_message}")
|
352
|
+
else:
|
353
|
+
logger.warning(f"Agent can not be registered to beeai server: {e}")
|
354
|
+
except Exception:
|
355
|
+
logger.warning(f"Agent can not be registered to beeai server: {e}")
|
acp_sdk/server/telemetry.py
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
import logging
|
2
2
|
|
3
|
+
from fastapi import FastAPI
|
3
4
|
from opentelemetry import metrics, trace
|
4
5
|
from opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter
|
5
6
|
from opentelemetry.exporter.otlp.proto.http.metric_exporter import OTLPMetricExporter
|
6
7
|
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
|
8
|
+
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
|
7
9
|
from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler
|
8
10
|
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
|
9
11
|
from opentelemetry.sdk.metrics import MeterProvider
|
@@ -22,8 +24,10 @@ from acp_sdk.version import __version__
|
|
22
24
|
root_logger = logging.getLogger()
|
23
25
|
|
24
26
|
|
25
|
-
def configure_telemetry() -> None:
|
26
|
-
"""Utility that configures opentelemetry with OTLP exporter"""
|
27
|
+
def configure_telemetry(app: FastAPI) -> None:
|
28
|
+
"""Utility that configures opentelemetry with OTLP exporter and FastAPI instrumentation"""
|
29
|
+
|
30
|
+
FastAPIInstrumentor.instrument_app(app)
|
27
31
|
|
28
32
|
resource = Resource(
|
29
33
|
attributes={
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: acp-sdk
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.9.1
|
4
4
|
Summary: Agent Communication Protocol SDK
|
5
5
|
Author: IBM Corp.
|
6
6
|
Maintainer-email: Tomas Pilar <thomas7pilar@gmail.com>
|
@@ -16,7 +16,7 @@ Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.31.1
|
|
16
16
|
Requires-Dist: opentelemetry-instrumentation-fastapi>=0.52b1
|
17
17
|
Requires-Dist: opentelemetry-instrumentation-httpx>=0.52b1
|
18
18
|
Requires-Dist: opentelemetry-sdk>=1.31.1
|
19
|
-
Requires-Dist: pydantic>=2.
|
19
|
+
Requires-Dist: pydantic>=2.0.0
|
20
20
|
Description-Content-Type: text/markdown
|
21
21
|
|
22
22
|
# Agent Communication Protocol SDK for Python
|
@@ -3,25 +3,25 @@ acp_sdk/instrumentation.py,sha256=JqSyvILN3sGAfOZrmckQq4-M_4_5alyPn95DK0o5lfA,16
|
|
3
3
|
acp_sdk/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
4
4
|
acp_sdk/version.py,sha256=Niy83rgvigB4hL_rR-O4ySvI7dj6xnqkyOe_JTymi9s,73
|
5
5
|
acp_sdk/client/__init__.py,sha256=Bca1DORrswxzZsrR2aUFpATuNG2xNSmYvF1Z2WJaVbc,51
|
6
|
-
acp_sdk/client/client.py,sha256=
|
6
|
+
acp_sdk/client/client.py,sha256=7GVD7eVlaSU78O3puMlyoOTqKjTwZYaBKLHyYvbvr3I,8504
|
7
7
|
acp_sdk/client/types.py,sha256=_H6zYt-2OHOOYRtssRnbDIiwmgsl2-KIXc9lb-mJLFA,133
|
8
8
|
acp_sdk/client/utils.py,sha256=2jhJyrPJmVFRoDJh0q_JMqOMlC3IxCh-6HXed-PIZS8,924
|
9
9
|
acp_sdk/models/__init__.py,sha256=numSDBDT1QHx7n_Y3Deb5VOvKWcUBxbOEaMwQBSRHxc,151
|
10
10
|
acp_sdk/models/errors.py,sha256=rEyaMVvQuBi7fwWe_d0PGGySYsD3FZTluQ-SkC0yhAs,444
|
11
|
-
acp_sdk/models/models.py,sha256=
|
11
|
+
acp_sdk/models/models.py,sha256=So5D9VjJxX2jdOF8BGc3f9D2ssbAyFEO2Rgr1KykI-M,7730
|
12
12
|
acp_sdk/models/schemas.py,sha256=_ah7_zHsQJGxDXvnzsBvASdRsQHVphFQ7Sum6A04iRw,759
|
13
13
|
acp_sdk/server/__init__.py,sha256=mxBBBFaZuMEUENRMLwp1XZkuLeT9QghcFmNvjnqvAAU,377
|
14
14
|
acp_sdk/server/agent.py,sha256=6VBKn_qVXqUl79G8T7grwhnuLMwr67d4UGagMGX1hMs,6586
|
15
|
-
acp_sdk/server/app.py,sha256=
|
16
|
-
acp_sdk/server/bundle.py,sha256=
|
15
|
+
acp_sdk/server/app.py,sha256=ViumwzMngn63wtpFllu3nnIOt9JL9PQYrTcI8v-_uY4,7257
|
16
|
+
acp_sdk/server/bundle.py,sha256=umD2GgDp17lUddu0adpp1zUcm1JJvDrDpIZ0uR-6VeY,7204
|
17
17
|
acp_sdk/server/context.py,sha256=MgnLV6qcDIhc_0BjW7r4Jj1tHts4ZuwpdTGIBnz2Mgo,1036
|
18
18
|
acp_sdk/server/errors.py,sha256=GSO8yYIqEeX8Y4Lz86ks35dMTHiQiXuOrLYYx0eXsbI,2110
|
19
19
|
acp_sdk/server/logging.py,sha256=Oc8yZigCsuDnHHPsarRzu0RX3NKaLEgpELM2yovGKDI,411
|
20
|
-
acp_sdk/server/server.py,sha256=
|
20
|
+
acp_sdk/server/server.py,sha256=0thIxmqLV-hqwSqP_TUSZAl9pog06lROAQgnSIIabME,13621
|
21
21
|
acp_sdk/server/session.py,sha256=ekz1o6Sy1tQZlpaoS_VgbvFuUQh2qpiHG71mvBdvhgc,662
|
22
|
-
acp_sdk/server/telemetry.py,sha256=
|
22
|
+
acp_sdk/server/telemetry.py,sha256=lbB2ppijUcqbHUOn0e-15LGcVvT_qrMguq8qBokICac,2016
|
23
23
|
acp_sdk/server/types.py,sha256=gLb5wCkMYhmu2laj_ymK-TPfN9LSjRgKOP1H_893UzA,304
|
24
24
|
acp_sdk/server/utils.py,sha256=BhZKBNaLgczX6aYjxYva-6VI1bKmHtYQ5YDA5LrwF50,1831
|
25
|
-
acp_sdk-0.
|
26
|
-
acp_sdk-0.
|
27
|
-
acp_sdk-0.
|
25
|
+
acp_sdk-0.9.1.dist-info/METADATA,sha256=fdUTU2kHk-OakxDoaTCLUagieJuM8DjsKZiFsOzDEK8,1650
|
26
|
+
acp_sdk-0.9.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
27
|
+
acp_sdk-0.9.1.dist-info/RECORD,,
|
File without changes
|