Skip to content

Commit 51a606f

Browse files
feat(api): adding support for agent skills
1 parent 16eb640 commit 51a606f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+3432
-395
lines changed

.stats.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
configured_endpoints: 26
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/anthropic%2Fanthropic-c91c0b5257f197335770ca7195d6b56e5808bf90d40580ca833095dfe56d2954.yml
3-
openapi_spec_hash: 592d90505082223899e0638ad56ba162
4-
config_hash: 24ad78f46908cfe5b81c053facaf4194
1+
configured_endpoints: 34
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/anthropic%2Fanthropic-284ade6201f97a13e95e2a4e38deefa8cb3d53c45fae1022c5a01520e76338be.yml
3+
openapi_spec_hash: 327b1deb1eba170331a3ac42eabedfbe
4+
config_hash: 291fe920e1e3b71db2e92ced81e1b859

api.md

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,7 @@ from anthropic.types.beta import (
243243
BetaCodeExecutionToolResultErrorCode,
244244
BetaCodeExecutionToolResultErrorParam,
245245
BetaContainer,
246+
BetaContainerParams,
246247
BetaContainerUploadBlock,
247248
BetaContainerUploadBlockParam,
248249
BetaContentBlock,
@@ -295,6 +296,8 @@ from anthropic.types.beta import (
295296
BetaServerToolUseBlock,
296297
BetaServerToolUseBlockParam,
297298
BetaSignatureDelta,
299+
BetaSkill,
300+
BetaSkillParams,
298301
BetaStopReason,
299302
BetaTextBlock,
300303
BetaTextBlockParam,
@@ -409,3 +412,43 @@ Methods:
409412
- <code title="get /v1/files/{file_id}/content?beta=true">client.beta.files.<a href="./src/anthropic/resources/beta/files.py">download</a>(file_id) -> BinaryAPIResponse</code>
410413
- <code title="get /v1/files/{file_id}?beta=true">client.beta.files.<a href="./src/anthropic/resources/beta/files.py">retrieve_metadata</a>(file_id) -> <a href="./src/anthropic/types/beta/file_metadata.py">FileMetadata</a></code>
411414
- <code title="post /v1/files?beta=true">client.beta.files.<a href="./src/anthropic/resources/beta/files.py">upload</a>(\*\*<a href="src/anthropic/types/beta/file_upload_params.py">params</a>) -> <a href="./src/anthropic/types/beta/file_metadata.py">FileMetadata</a></code>
415+
416+
## Skills
417+
418+
Types:
419+
420+
```python
421+
from anthropic.types.beta import (
422+
SkillCreateResponse,
423+
SkillRetrieveResponse,
424+
SkillListResponse,
425+
SkillDeleteResponse,
426+
)
427+
```
428+
429+
Methods:
430+
431+
- <code title="post /v1/skills?beta=true">client.beta.skills.<a href="./src/anthropic/resources/beta/skills/skills.py">create</a>(\*\*<a href="src/anthropic/types/beta/skill_create_params.py">params</a>) -> <a href="./src/anthropic/types/beta/skill_create_response.py">SkillCreateResponse</a></code>
432+
- <code title="get /v1/skills/{skill_id}?beta=true">client.beta.skills.<a href="./src/anthropic/resources/beta/skills/skills.py">retrieve</a>(skill_id) -> <a href="./src/anthropic/types/beta/skill_retrieve_response.py">SkillRetrieveResponse</a></code>
433+
- <code title="get /v1/skills?beta=true">client.beta.skills.<a href="./src/anthropic/resources/beta/skills/skills.py">list</a>(\*\*<a href="src/anthropic/types/beta/skill_list_params.py">params</a>) -> <a href="./src/anthropic/types/beta/skill_list_response.py">SyncPageCursor[SkillListResponse]</a></code>
434+
- <code title="delete /v1/skills/{skill_id}?beta=true">client.beta.skills.<a href="./src/anthropic/resources/beta/skills/skills.py">delete</a>(skill_id) -> <a href="./src/anthropic/types/beta/skill_delete_response.py">SkillDeleteResponse</a></code>
435+
436+
### Versions
437+
438+
Types:
439+
440+
```python
441+
from anthropic.types.beta.skills import (
442+
VersionCreateResponse,
443+
VersionRetrieveResponse,
444+
VersionListResponse,
445+
VersionDeleteResponse,
446+
)
447+
```
448+
449+
Methods:
450+
451+
- <code title="post /v1/skills/{skill_id}/versions?beta=true">client.beta.skills.versions.<a href="./src/anthropic/resources/beta/skills/versions.py">create</a>(skill_id, \*\*<a href="src/anthropic/types/beta/skills/version_create_params.py">params</a>) -> <a href="./src/anthropic/types/beta/skills/version_create_response.py">VersionCreateResponse</a></code>
452+
- <code title="get /v1/skills/{skill_id}/versions/{version}?beta=true">client.beta.skills.versions.<a href="./src/anthropic/resources/beta/skills/versions.py">retrieve</a>(version, \*, skill_id) -> <a href="./src/anthropic/types/beta/skills/version_retrieve_response.py">VersionRetrieveResponse</a></code>
453+
- <code title="get /v1/skills/{skill_id}/versions?beta=true">client.beta.skills.versions.<a href="./src/anthropic/resources/beta/skills/versions.py">list</a>(skill_id, \*\*<a href="src/anthropic/types/beta/skills/version_list_params.py">params</a>) -> <a href="./src/anthropic/types/beta/skills/version_list_response.py">SyncPageCursor[VersionListResponse]</a></code>
454+
- <code title="delete /v1/skills/{skill_id}/versions/{version}?beta=true">client.beta.skills.versions.<a href="./src/anthropic/resources/beta/skills/versions.py">delete</a>(version, \*, skill_id) -> <a href="./src/anthropic/types/beta/skills/version_delete_response.py">VersionDeleteResponse</a></code>

src/anthropic/lib/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from ._files import files_from_dir as files_from_dir, async_files_from_dir as async_files_from_dir

src/anthropic/lib/_files.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
from __future__ import annotations
2+
3+
import os
4+
from pathlib import Path
5+
6+
import anyio
7+
8+
from .._types import FileTypes
9+
10+
11+
def files_from_dir(directory: str | os.PathLike[str]) -> list[FileTypes]:
12+
path = Path(directory)
13+
14+
files: list[FileTypes] = []
15+
_collect_files(path, path.parent, files)
16+
return files
17+
18+
19+
def _collect_files(directory: Path, relative_to: Path, files: list[FileTypes]) -> None:
20+
for path in directory.iterdir():
21+
if path.is_dir():
22+
_collect_files(path, relative_to, files)
23+
continue
24+
25+
files.append((str(path.relative_to(relative_to)), path.read_bytes()))
26+
27+
28+
async def async_files_from_dir(directory: str | os.PathLike[str]) -> list[FileTypes]:
29+
path = anyio.Path(directory)
30+
31+
files: list[FileTypes] = []
32+
await _async_collect_files(path, path.parent, files)
33+
return files
34+
35+
36+
async def _async_collect_files(directory: anyio.Path, relative_to: anyio.Path, files: list[FileTypes]) -> None:
37+
async for path in directory.iterdir():
38+
if await path.is_dir():
39+
await _async_collect_files(path, relative_to, files)
40+
continue
41+
42+
files.append((str(path.relative_to(relative_to)), await path.read_bytes()))

src/anthropic/pagination.py

Lines changed: 117 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
from ._base_client import BasePage, PageInfo, BaseSyncPage, BaseAsyncPage
77

8-
__all__ = ["SyncPage", "AsyncPage"]
8+
__all__ = ["SyncPage", "AsyncPage", "SyncTokenPage", "AsyncTokenPage", "SyncPageCursor", "AsyncPageCursor"]
99

1010
_T = TypeVar("_T")
1111

@@ -82,3 +82,119 @@ def next_page_info(self) -> Optional[PageInfo]:
8282
return None
8383

8484
return PageInfo(params={"after_id": last_id})
85+
86+
87+
class SyncTokenPage(BaseSyncPage[_T], BasePage[_T], Generic[_T]):
88+
data: List[_T]
89+
has_more: Optional[bool] = None
90+
next_page: Optional[str] = None
91+
92+
@override
93+
def _get_page_items(self) -> List[_T]:
94+
data = self.data
95+
if not data:
96+
return []
97+
return data
98+
99+
@override
100+
def has_next_page(self) -> bool:
101+
has_more = self.has_more
102+
if has_more is not None and has_more is False:
103+
return False
104+
105+
return super().has_next_page()
106+
107+
@override
108+
def next_page_info(self) -> Optional[PageInfo]:
109+
next_page = self.next_page
110+
if not next_page:
111+
return None
112+
113+
return PageInfo(params={"page_token": next_page})
114+
115+
116+
class AsyncTokenPage(BaseAsyncPage[_T], BasePage[_T], Generic[_T]):
117+
data: List[_T]
118+
has_more: Optional[bool] = None
119+
next_page: Optional[str] = None
120+
121+
@override
122+
def _get_page_items(self) -> List[_T]:
123+
data = self.data
124+
if not data:
125+
return []
126+
return data
127+
128+
@override
129+
def has_next_page(self) -> bool:
130+
has_more = self.has_more
131+
if has_more is not None and has_more is False:
132+
return False
133+
134+
return super().has_next_page()
135+
136+
@override
137+
def next_page_info(self) -> Optional[PageInfo]:
138+
next_page = self.next_page
139+
if not next_page:
140+
return None
141+
142+
return PageInfo(params={"page_token": next_page})
143+
144+
145+
class SyncPageCursor(BaseSyncPage[_T], BasePage[_T], Generic[_T]):
146+
data: List[_T]
147+
has_more: Optional[bool] = None
148+
next_page: Optional[str] = None
149+
150+
@override
151+
def _get_page_items(self) -> List[_T]:
152+
data = self.data
153+
if not data:
154+
return []
155+
return data
156+
157+
@override
158+
def has_next_page(self) -> bool:
159+
has_more = self.has_more
160+
if has_more is not None and has_more is False:
161+
return False
162+
163+
return super().has_next_page()
164+
165+
@override
166+
def next_page_info(self) -> Optional[PageInfo]:
167+
next_page = self.next_page
168+
if not next_page:
169+
return None
170+
171+
return PageInfo(params={"page": next_page})
172+
173+
174+
class AsyncPageCursor(BaseAsyncPage[_T], BasePage[_T], Generic[_T]):
175+
data: List[_T]
176+
has_more: Optional[bool] = None
177+
next_page: Optional[str] = None
178+
179+
@override
180+
def _get_page_items(self) -> List[_T]:
181+
data = self.data
182+
if not data:
183+
return []
184+
return data
185+
186+
@override
187+
def has_next_page(self) -> bool:
188+
has_more = self.has_more
189+
if has_more is not None and has_more is False:
190+
return False
191+
192+
return super().has_next_page()
193+
194+
@override
195+
def next_page_info(self) -> Optional[PageInfo]:
196+
next_page = self.next_page
197+
if not next_page:
198+
return None
199+
200+
return PageInfo(params={"page": next_page})

src/anthropic/resources/beta/__init__.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,14 @@
2424
ModelsWithStreamingResponse,
2525
AsyncModelsWithStreamingResponse,
2626
)
27+
from .skills import (
28+
Skills,
29+
AsyncSkills,
30+
SkillsWithRawResponse,
31+
AsyncSkillsWithRawResponse,
32+
SkillsWithStreamingResponse,
33+
AsyncSkillsWithStreamingResponse,
34+
)
2735
from .messages import (
2836
Messages,
2937
AsyncMessages,
@@ -52,6 +60,12 @@
5260
"AsyncFilesWithRawResponse",
5361
"FilesWithStreamingResponse",
5462
"AsyncFilesWithStreamingResponse",
63+
"Skills",
64+
"AsyncSkills",
65+
"SkillsWithRawResponse",
66+
"AsyncSkillsWithRawResponse",
67+
"SkillsWithStreamingResponse",
68+
"AsyncSkillsWithStreamingResponse",
5569
"Beta",
5670
"AsyncBeta",
5771
"BetaWithRawResponse",

src/anthropic/resources/beta/beta.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,14 @@
2020
)
2121
from ..._compat import cached_property
2222
from ..._resource import SyncAPIResource, AsyncAPIResource
23+
from .skills.skills import (
24+
Skills,
25+
AsyncSkills,
26+
SkillsWithRawResponse,
27+
AsyncSkillsWithRawResponse,
28+
SkillsWithStreamingResponse,
29+
AsyncSkillsWithStreamingResponse,
30+
)
2331
from .messages.messages import (
2432
Messages,
2533
AsyncMessages,
@@ -45,6 +53,10 @@ def messages(self) -> Messages:
4553
def files(self) -> Files:
4654
return Files(self._client)
4755

56+
@cached_property
57+
def skills(self) -> Skills:
58+
return Skills(self._client)
59+
4860
@cached_property
4961
def with_raw_response(self) -> BetaWithRawResponse:
5062
"""
@@ -78,6 +90,10 @@ def messages(self) -> AsyncMessages:
7890
def files(self) -> AsyncFiles:
7991
return AsyncFiles(self._client)
8092

93+
@cached_property
94+
def skills(self) -> AsyncSkills:
95+
return AsyncSkills(self._client)
96+
8197
@cached_property
8298
def with_raw_response(self) -> AsyncBetaWithRawResponse:
8399
"""
@@ -114,6 +130,10 @@ def messages(self) -> MessagesWithRawResponse:
114130
def files(self) -> FilesWithRawResponse:
115131
return FilesWithRawResponse(self._beta.files)
116132

133+
@cached_property
134+
def skills(self) -> SkillsWithRawResponse:
135+
return SkillsWithRawResponse(self._beta.skills)
136+
117137

118138
class AsyncBetaWithRawResponse:
119139
def __init__(self, beta: AsyncBeta) -> None:
@@ -131,6 +151,10 @@ def messages(self) -> AsyncMessagesWithRawResponse:
131151
def files(self) -> AsyncFilesWithRawResponse:
132152
return AsyncFilesWithRawResponse(self._beta.files)
133153

154+
@cached_property
155+
def skills(self) -> AsyncSkillsWithRawResponse:
156+
return AsyncSkillsWithRawResponse(self._beta.skills)
157+
134158

135159
class BetaWithStreamingResponse:
136160
def __init__(self, beta: Beta) -> None:
@@ -148,6 +172,10 @@ def messages(self) -> MessagesWithStreamingResponse:
148172
def files(self) -> FilesWithStreamingResponse:
149173
return FilesWithStreamingResponse(self._beta.files)
150174

175+
@cached_property
176+
def skills(self) -> SkillsWithStreamingResponse:
177+
return SkillsWithStreamingResponse(self._beta.skills)
178+
151179

152180
class AsyncBetaWithStreamingResponse:
153181
def __init__(self, beta: AsyncBeta) -> None:
@@ -164,3 +192,7 @@ def messages(self) -> AsyncMessagesWithStreamingResponse:
164192
@cached_property
165193
def files(self) -> AsyncFilesWithStreamingResponse:
166194
return AsyncFilesWithStreamingResponse(self._beta.files)
195+
196+
@cached_property
197+
def skills(self) -> AsyncSkillsWithStreamingResponse:
198+
return AsyncSkillsWithStreamingResponse(self._beta.skills)

0 commit comments

Comments
 (0)