acp-sdk 0.13.0__py3-none-any.whl → 1.0.0__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/models/common.py +5 -0
- acp_sdk/models/errors.py +5 -1
- acp_sdk/models/models.py +16 -9
- acp_sdk/server/agent.py +18 -0
- acp_sdk/server/app.py +26 -2
- acp_sdk/server/server.py +18 -1
- {acp_sdk-0.13.0.dist-info → acp_sdk-1.0.0.dist-info}/METADATA +1 -1
- {acp_sdk-0.13.0.dist-info → acp_sdk-1.0.0.dist-info}/RECORD +9 -8
- {acp_sdk-0.13.0.dist-info → acp_sdk-1.0.0.dist-info}/WHEEL +0 -0
acp_sdk/models/common.py
ADDED
acp_sdk/models/errors.py
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
from enum import Enum
|
|
2
|
+
from typing import Optional
|
|
2
3
|
|
|
3
4
|
from pydantic import BaseModel
|
|
4
5
|
|
|
6
|
+
from acp_sdk.models.common import AnyModel
|
|
7
|
+
|
|
5
8
|
|
|
6
9
|
class ErrorCode(str, Enum):
|
|
7
10
|
SERVER_ERROR = "server_error"
|
|
@@ -10,8 +13,9 @@ class ErrorCode(str, Enum):
|
|
|
10
13
|
|
|
11
14
|
|
|
12
15
|
class Error(BaseModel):
|
|
13
|
-
code: ErrorCode
|
|
16
|
+
code: ErrorCode | str # Allow arbitrary string for backwards compatibility
|
|
14
17
|
message: str
|
|
18
|
+
data: Optional[AnyModel] = None
|
|
15
19
|
|
|
16
20
|
|
|
17
21
|
class ACPError(Exception):
|
acp_sdk/models/models.py
CHANGED
|
@@ -8,16 +8,13 @@ from typing import Any, Literal, Optional, Union
|
|
|
8
8
|
from pydantic import AnyUrl, BaseModel, ConfigDict, Field
|
|
9
9
|
from pydantic.json_schema import SkipJsonSchema
|
|
10
10
|
|
|
11
|
+
from acp_sdk.models.common import AnyModel
|
|
11
12
|
from acp_sdk.models.errors import ACPError, Error
|
|
12
13
|
from acp_sdk.models.platform import PlatformUIAnnotation
|
|
13
14
|
from acp_sdk.models.types import AgentName, ResourceUrl, RunId, SessionId
|
|
14
15
|
from acp_sdk.shared import ResourceLoader, ResourceStore
|
|
15
16
|
|
|
16
17
|
|
|
17
|
-
class AnyModel(BaseModel):
|
|
18
|
-
model_config = ConfigDict(extra="allow")
|
|
19
|
-
|
|
20
|
-
|
|
21
18
|
class Author(BaseModel):
|
|
22
19
|
name: str
|
|
23
20
|
email: str | None = None
|
|
@@ -111,11 +108,11 @@ class CitationMetadata(BaseModel):
|
|
|
111
108
|
"""
|
|
112
109
|
|
|
113
110
|
kind: Literal["citation"] = "citation"
|
|
114
|
-
start_index: Optional[int]
|
|
115
|
-
end_index: Optional[int]
|
|
116
|
-
url: Optional[str]
|
|
117
|
-
title: Optional[str]
|
|
118
|
-
description: Optional[str]
|
|
111
|
+
start_index: Optional[int] = None
|
|
112
|
+
end_index: Optional[int] = None
|
|
113
|
+
url: Optional[str] = None
|
|
114
|
+
title: Optional[str] = None
|
|
115
|
+
description: Optional[str] = None
|
|
119
116
|
|
|
120
117
|
|
|
121
118
|
class TrajectoryMetadata(BaseModel):
|
|
@@ -353,10 +350,20 @@ Event = Union[
|
|
|
353
350
|
]
|
|
354
351
|
|
|
355
352
|
|
|
353
|
+
class InputContentTypes(BaseModel):
|
|
354
|
+
types: list[str]
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
class OutputContentTypes(BaseModel):
|
|
358
|
+
types: list[str]
|
|
359
|
+
|
|
360
|
+
|
|
356
361
|
class AgentManifest(BaseModel):
|
|
357
362
|
name: str
|
|
358
363
|
description: str | None = None
|
|
359
364
|
metadata: Metadata = Metadata()
|
|
365
|
+
input_content_types: list[str] = Field(default_factory=lambda: ["*/*"])
|
|
366
|
+
output_content_types: list[str] = Field(default_factory=lambda: ["*/*"])
|
|
360
367
|
|
|
361
368
|
|
|
362
369
|
class Session(BaseModel):
|
acp_sdk/server/agent.py
CHANGED
|
@@ -17,6 +17,14 @@ class AgentManifest(abc.ABC):
|
|
|
17
17
|
def description(self) -> str:
|
|
18
18
|
return ""
|
|
19
19
|
|
|
20
|
+
@property
|
|
21
|
+
def input_content_types(self) -> list[str]:
|
|
22
|
+
return []
|
|
23
|
+
|
|
24
|
+
@property
|
|
25
|
+
def output_content_types(self) -> list[str]:
|
|
26
|
+
return []
|
|
27
|
+
|
|
20
28
|
@property
|
|
21
29
|
def metadata(self) -> Metadata:
|
|
22
30
|
return Metadata()
|
|
@@ -38,6 +46,8 @@ def agent(
|
|
|
38
46
|
description: str | None = None,
|
|
39
47
|
*,
|
|
40
48
|
metadata: Metadata | None = None,
|
|
49
|
+
input_content_types: list[str] | None = None,
|
|
50
|
+
output_content_types: list[str] | None = None,
|
|
41
51
|
) -> Callable[[Callable], AgentManifest]:
|
|
42
52
|
"""Decorator to create an agent."""
|
|
43
53
|
|
|
@@ -67,6 +77,14 @@ def agent(
|
|
|
67
77
|
def metadata(self) -> Metadata:
|
|
68
78
|
return metadata or Metadata()
|
|
69
79
|
|
|
80
|
+
@property
|
|
81
|
+
def input_content_types(self) -> list[str]:
|
|
82
|
+
return input_content_types or ["*/*"]
|
|
83
|
+
|
|
84
|
+
@property
|
|
85
|
+
def output_content_types(self) -> list[str]:
|
|
86
|
+
return output_content_types or ["*/*"]
|
|
87
|
+
|
|
70
88
|
agent: AgentManifest
|
|
71
89
|
if inspect.isasyncgenfunction(fn):
|
|
72
90
|
|
acp_sdk/server/app.py
CHANGED
|
@@ -13,6 +13,7 @@ from fastapi.encoders import jsonable_encoder
|
|
|
13
13
|
from fastapi.middleware.cors import CORSMiddleware
|
|
14
14
|
from fastapi.responses import JSONResponse, StreamingResponse
|
|
15
15
|
from obstore.exceptions import NotFoundError
|
|
16
|
+
from pydantic import AnyHttpUrl, ValidationError
|
|
16
17
|
|
|
17
18
|
from acp_sdk.models import (
|
|
18
19
|
ACPError,
|
|
@@ -67,6 +68,7 @@ def create_app(
|
|
|
67
68
|
resource_store: ResourceStore | None = None,
|
|
68
69
|
resource_loader: ResourceLoader | None = None,
|
|
69
70
|
forward_resources: bool = True,
|
|
71
|
+
forward_base_url: AnyHttpUrl | str | None = None,
|
|
70
72
|
lifespan: Lifespan[AppType] | None = None,
|
|
71
73
|
dependencies: list[Depends] | None = None,
|
|
72
74
|
) -> FastAPI:
|
|
@@ -76,6 +78,12 @@ def create_app(
|
|
|
76
78
|
):
|
|
77
79
|
raise ValueError("Resource forwarding must be enabled when resource store does not support HTTP URLs")
|
|
78
80
|
|
|
81
|
+
if isinstance(forward_base_url, str):
|
|
82
|
+
try:
|
|
83
|
+
forward_base_url = AnyHttpUrl(forward_base_url)
|
|
84
|
+
except ValidationError:
|
|
85
|
+
raise ValueError("forward_base_url must be a valid http(s) url")
|
|
86
|
+
|
|
79
87
|
executor: ThreadPoolExecutor
|
|
80
88
|
client = httpx.AsyncClient()
|
|
81
89
|
|
|
@@ -141,7 +149,13 @@ def create_app(
|
|
|
141
149
|
async def list_agents() -> AgentsListResponse:
|
|
142
150
|
return AgentsListResponse(
|
|
143
151
|
agents=[
|
|
144
|
-
AgentModel(
|
|
152
|
+
AgentModel(
|
|
153
|
+
name=agent.name,
|
|
154
|
+
description=agent.description,
|
|
155
|
+
metadata=agent.metadata,
|
|
156
|
+
input_content_types=agent.input_content_types,
|
|
157
|
+
output_content_types=agent.output_content_types,
|
|
158
|
+
)
|
|
145
159
|
for agent in agents.values()
|
|
146
160
|
]
|
|
147
161
|
)
|
|
@@ -149,7 +163,13 @@ def create_app(
|
|
|
149
163
|
@app.get("/agents/{name}")
|
|
150
164
|
async def read_agent(name: AgentName) -> AgentReadResponse:
|
|
151
165
|
agent = find_agent(name)
|
|
152
|
-
return AgentModel(
|
|
166
|
+
return AgentModel(
|
|
167
|
+
name=agent.name,
|
|
168
|
+
description=agent.description,
|
|
169
|
+
metadata=agent.metadata,
|
|
170
|
+
input_content_types=agent.input_content_types,
|
|
171
|
+
output_content_types=agent.output_content_types,
|
|
172
|
+
)
|
|
153
173
|
|
|
154
174
|
@app.get("/ping")
|
|
155
175
|
async def ping() -> PingResponse:
|
|
@@ -165,6 +185,10 @@ def create_app(
|
|
|
165
185
|
def create_resource_url_forwarded(id: ResourceId) -> ResourceUrl:
|
|
166
186
|
if not forward_resources:
|
|
167
187
|
raise RuntimeError("Resource forwarding disabled")
|
|
188
|
+
if forward_base_url:
|
|
189
|
+
return ResourceUrl(
|
|
190
|
+
url=str(app.url_path_for("get_resource", resource_id=id).make_absolute_url(str(forward_base_url)))
|
|
191
|
+
)
|
|
168
192
|
return ResourceUrl(url=str(req.url_for("get_resource", resource_id=id)))
|
|
169
193
|
|
|
170
194
|
async def create_resource_url(id: ResourceId) -> ResourceUrl:
|
acp_sdk/server/server.py
CHANGED
|
@@ -9,6 +9,7 @@ import requests
|
|
|
9
9
|
import uvicorn
|
|
10
10
|
import uvicorn.config
|
|
11
11
|
from fastapi import FastAPI
|
|
12
|
+
from pydantic import AnyHttpUrl
|
|
12
13
|
|
|
13
14
|
from acp_sdk.models import Metadata
|
|
14
15
|
from acp_sdk.server.agent import AgentManifest
|
|
@@ -31,13 +32,21 @@ class Server:
|
|
|
31
32
|
self,
|
|
32
33
|
name: str | None = None,
|
|
33
34
|
description: str | None = None,
|
|
35
|
+
input_content_types: list[str] | None = None,
|
|
36
|
+
output_content_types: list[str] | None = None,
|
|
34
37
|
*,
|
|
35
38
|
metadata: Metadata | None = None,
|
|
36
39
|
) -> Callable:
|
|
37
40
|
"""Decorator to register an agent."""
|
|
38
41
|
|
|
39
42
|
def decorator(fn: Callable) -> Callable:
|
|
40
|
-
agent = agent_decorator(
|
|
43
|
+
agent = agent_decorator(
|
|
44
|
+
name=name,
|
|
45
|
+
description=description,
|
|
46
|
+
metadata=metadata,
|
|
47
|
+
input_content_types=input_content_types,
|
|
48
|
+
output_content_types=output_content_types,
|
|
49
|
+
)(fn)
|
|
41
50
|
self.register(agent)
|
|
42
51
|
return fn
|
|
43
52
|
|
|
@@ -59,6 +68,8 @@ class Server:
|
|
|
59
68
|
store: Store | None = None,
|
|
60
69
|
resource_store: ResourceStore | None = None,
|
|
61
70
|
resource_loader: ResourceLoader | None = None,
|
|
71
|
+
forward_resources: bool = True,
|
|
72
|
+
forward_base_url: AnyHttpUrl | str | None = None,
|
|
62
73
|
host: str = "127.0.0.1",
|
|
63
74
|
port: int = 8000,
|
|
64
75
|
uds: str | None = None,
|
|
@@ -127,6 +138,8 @@ class Server:
|
|
|
127
138
|
store=store,
|
|
128
139
|
resource_loader=resource_loader,
|
|
129
140
|
resource_store=resource_store,
|
|
141
|
+
forward_resources=forward_resources,
|
|
142
|
+
forward_base_url=forward_base_url,
|
|
130
143
|
)
|
|
131
144
|
|
|
132
145
|
if configure_logger:
|
|
@@ -196,6 +209,8 @@ class Server:
|
|
|
196
209
|
store: Store | None = None,
|
|
197
210
|
resource_store: ResourceStore | None = None,
|
|
198
211
|
resource_loader: ResourceLoader | None = None,
|
|
212
|
+
forward_resources: bool = True,
|
|
213
|
+
forward_base_url: AnyHttpUrl | str | None = None,
|
|
199
214
|
host: str = "127.0.0.1",
|
|
200
215
|
port: int = 8000,
|
|
201
216
|
uds: str | None = None,
|
|
@@ -256,6 +271,8 @@ class Server:
|
|
|
256
271
|
store=store,
|
|
257
272
|
resource_store=resource_store,
|
|
258
273
|
resource_loader=resource_loader,
|
|
274
|
+
forward_resources=forward_resources,
|
|
275
|
+
forward_base_url=forward_base_url,
|
|
259
276
|
host=host,
|
|
260
277
|
port=port,
|
|
261
278
|
uds=uds,
|
|
@@ -7,20 +7,21 @@ acp_sdk/client/client.py,sha256=3lQ0URQK2q6_QuADMhbbEijrWegaFRtAvfPDs2XnMS8,1259
|
|
|
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=_XDSvUwlHeRsqUayAxHusJ5s8Z1jWXV1ZcUKlJakOt4,200
|
|
10
|
-
acp_sdk/models/
|
|
11
|
-
acp_sdk/models/
|
|
10
|
+
acp_sdk/models/common.py,sha256=Rb22TZCTs_cjTSZ1ti0qBHBNh1yH7VL94fIaYwliAYU,117
|
|
11
|
+
acp_sdk/models/errors.py,sha256=r-blfUHLs4OO9twop_Iavb3O_Y3mj18fYBQHGLZiLT0,612
|
|
12
|
+
acp_sdk/models/models.py,sha256=J47J4Az40mnGreiZRCD17gb8QjvOEfY2iuD4jdETaOc,12206
|
|
12
13
|
acp_sdk/models/platform.py,sha256=qgQhBZZNPG9XLlytEZmuv1LTkejbklmlj7YpnpUV_DE,497
|
|
13
14
|
acp_sdk/models/schemas.py,sha256=Vu3aO-6M0IW71I9thxAiphLGXXMvyZXFMJCdj7euUmc,915
|
|
14
15
|
acp_sdk/models/types.py,sha256=tH79qqpW3DrPJggZD1KFlLtGE_ZKT6eLtwiR3p3x2QM,145
|
|
15
16
|
acp_sdk/server/__init__.py,sha256=TfTOOI7G2nejjOB6RZB5ujynyh3bFeH51pfDIMzv3N4,627
|
|
16
|
-
acp_sdk/server/agent.py,sha256=
|
|
17
|
-
acp_sdk/server/app.py,sha256=
|
|
17
|
+
acp_sdk/server/agent.py,sha256=T43TuYT4iVzfnxytvF1CbolLC_KoSRnITogmGWaRabs,4271
|
|
18
|
+
acp_sdk/server/app.py,sha256=SYjpo6gVJXkTpnQ70lYjLLXz23nIOQAT6X4n2QWZhUw,12502
|
|
18
19
|
acp_sdk/server/context.py,sha256=Xz1am_HLNTgEvG0IPtS0tRJcPk-rEhLtNyTQGUAvLQw,1271
|
|
19
20
|
acp_sdk/server/errors.py,sha256=GSO8yYIqEeX8Y4Lz86ks35dMTHiQiXuOrLYYx0eXsbI,2110
|
|
20
21
|
acp_sdk/server/executor.py,sha256=ktM1FCwixtbjsU60VM7PHxwF_Saz15M_9fNXN4mItrU,12607
|
|
21
22
|
acp_sdk/server/logging.py,sha256=Oc8yZigCsuDnHHPsarRzu0RX3NKaLEgpELM2yovGKDI,411
|
|
22
23
|
acp_sdk/server/resources.py,sha256=g9C2Xr_SyvAFsV1uHQLEe1H7CgLIjfQZ51Nj3n-w0f4,1174
|
|
23
|
-
acp_sdk/server/server.py,sha256=
|
|
24
|
+
acp_sdk/server/server.py,sha256=cnFAquwNvFnHQTzH20ZOJcwcTJFtgK78-uEthZJw0zc,15364
|
|
24
25
|
acp_sdk/server/telemetry.py,sha256=lbB2ppijUcqbHUOn0e-15LGcVvT_qrMguq8qBokICac,2016
|
|
25
26
|
acp_sdk/server/types.py,sha256=gLb5wCkMYhmu2laj_ymK-TPfN9LSjRgKOP1H_893UzA,304
|
|
26
27
|
acp_sdk/server/utils.py,sha256=O9GUZ8SKqk8P5Vo-N4BD7hXS3XuE7l8wifOhvKMX3ws,2715
|
|
@@ -32,6 +33,6 @@ acp_sdk/server/store/store.py,sha256=jGmYy9oiuVjhYYJY8QRo4g2J2Qyt1HLTmq_eHy4aI7c
|
|
|
32
33
|
acp_sdk/server/store/utils.py,sha256=JumEOMs1h1uGlnHnUGeguee-srGzT7_Y2NVEYt01QuY,92
|
|
33
34
|
acp_sdk/shared/__init__.py,sha256=vZuhdQ6lrWVdyYPmIyXpPvs5eMnzemhNek3gfYPA3Bc,138
|
|
34
35
|
acp_sdk/shared/resources.py,sha256=3oPvevYv2B1YaHyoMH85B7fcHVyhgZDUaDCBVEflTlA,1592
|
|
35
|
-
acp_sdk-0.
|
|
36
|
-
acp_sdk-0.
|
|
37
|
-
acp_sdk-0.
|
|
36
|
+
acp_sdk-1.0.0.dist-info/METADATA,sha256=Tez7d-Zl2X_j5oXqVCil6kUZdaIO_BWOep_LPbaPF6g,1712
|
|
37
|
+
acp_sdk-1.0.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
38
|
+
acp_sdk-1.0.0.dist-info/RECORD,,
|
|
File without changes
|