Skip to content

Commit 7cba28b

Browse files
release: 0.13.0 (#23)
* feat(api): api update * codegen metadata * codegen metadata * fix(client): add missing f-string prefix in file type error message * feat: Retrieve memories in third party harnesses * feat(api): api update * feat(memory): agent identity memory store attachments — API layer * feat(memory): wire memory stores into run pipeline and add listing endpoint * codegen metadata * codegen metadata * feat(api): api update * feat(agents): add prompt property to agent identity data model * feat(internal/types): support eagerly validating pydantic iterators * feat: Add per-agent AWS Bedrock OIDC inference role (backend) * ci: pin GitHub Actions to commit SHAs Pin all GitHub Actions referenced in generated workflows (both first-party `actions/*` and third-party) to immutable commit SHAs. Updating pinned actions is now a deliberate codegen-side bump rather than implicit on every workflow run. * feat: Codex auth: API key support. * feat(api): api update * feat: Add default harness selection for agents * feat(api): api update * feat(api): api update * feat: Partial support for multiple skills per run * codegen metadata * feat(api): api update * feat(api): api update * codegen metadata * feat(api): api update * codegen metadata * feat: Resolve Bedrock region server-side and ship as AWS_REGION * codegen metadata * feat(api): api update * feat: Add updated_at to agent API responses * feat(api): api update * feat: Support service account impersonation in GCP Workload Identity Federation config * release: 0.13.0 --------- Co-authored-by: stainless-app[bot] <142633134+stainless-app[bot]@users.noreply.github.com>
1 parent 1927cdf commit 7cba28b

28 files changed

Lines changed: 1177 additions & 56 deletions

.github/workflows/ci.yml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ jobs:
2121
runs-on: ${{ github.repository == 'stainless-sdks/warp-api-python' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
2222
if: (github.event_name == 'push' || github.event.pull_request.head.repo.fork) && (github.event_name != 'push' || github.event.head_commit.message != 'codegen metadata')
2323
steps:
24-
- uses: actions/checkout@v6
24+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
2525

2626
- name: Install uv
27-
uses: astral-sh/setup-uv@v5
27+
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2
2828
with:
2929
version: '0.10.2'
3030

@@ -43,10 +43,10 @@ jobs:
4343
id-token: write
4444
runs-on: ${{ github.repository == 'stainless-sdks/warp-api-python' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
4545
steps:
46-
- uses: actions/checkout@v6
46+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
4747

4848
- name: Install uv
49-
uses: astral-sh/setup-uv@v5
49+
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2
5050
with:
5151
version: '0.10.2'
5252

@@ -61,7 +61,7 @@ jobs:
6161
github.repository == 'stainless-sdks/warp-api-python' &&
6262
!startsWith(github.ref, 'refs/heads/stl/')
6363
id: github-oidc
64-
uses: actions/github-script@v8
64+
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
6565
with:
6666
script: core.setOutput('github_token', await core.getIDToken());
6767

@@ -81,10 +81,10 @@ jobs:
8181
runs-on: ${{ github.repository == 'stainless-sdks/warp-api-python' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
8282
if: github.event_name == 'push' || github.event.pull_request.head.repo.fork
8383
steps:
84-
- uses: actions/checkout@v6
84+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
8585

8686
- name: Install uv
87-
uses: astral-sh/setup-uv@v5
87+
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2
8888
with:
8989
version: '0.10.2'
9090

.github/workflows/publish-pypi.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ jobs:
1717
id-token: write
1818

1919
steps:
20-
- uses: actions/checkout@v6
20+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
2121

2222
- name: Install uv
23-
uses: astral-sh/setup-uv@v5
23+
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2
2424
with:
2525
version: '0.9.13'
2626

.github/workflows/release-doctor.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ jobs:
1212
if: github.repository == 'warpdotdev/oz-sdk-python' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || startsWith(github.head_ref, 'release-please') || github.head_ref == 'next')
1313

1414
steps:
15-
- uses: actions/checkout@v6
15+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
1616

1717
- name: Check release environment
1818
run: |

.release-please-manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
".": "0.12.0"
2+
".": "0.13.0"
33
}

.stats.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
configured_endpoints: 22
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/warp-bnavetta/warp-api-1fecc5f5d6ee664d804b81bd1aa6eec4d3f170ffa788d214fead4f7e95ab9d4e.yml
3-
openapi_spec_hash: 82990b03bd5a93e45bfc79db56ae7fc0
4-
config_hash: f52e7636f248f25c4ea0b086e7326816
1+
configured_endpoints: 23
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/warp-bnavetta/warp-api-964f646a32c318735de7673531a12788aede1840f7ab4893f2efa31c83440837.yml
3+
openapi_spec_hash: 30f07ff0bfb491efb11cd88fce79968a
4+
config_hash: 236823a4936c76818117c16aa5c188df

CHANGELOG.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,40 @@
11
# Changelog
22

3+
## 0.13.0 (2026-05-21)
4+
5+
Full Changelog: [v0.12.0...v0.13.0](https://github.com/warpdotdev/oz-sdk-python/compare/v0.12.0...v0.13.0)
6+
7+
### Features
8+
9+
* Add default harness selection for agents ([8cd06f6](https://github.com/warpdotdev/oz-sdk-python/commit/8cd06f6fcb48444e3861ff130d2fb4fa820e3aa7))
10+
* Add per-agent AWS Bedrock OIDC inference role (backend) ([e4aadec](https://github.com/warpdotdev/oz-sdk-python/commit/e4aadec916b2bea7e05e0e263b307449002e7f8b))
11+
* Add updated_at to agent API responses ([3188420](https://github.com/warpdotdev/oz-sdk-python/commit/318842095218a12c5b3ed1d945941e74ca5c9d54))
12+
* **agents:** add prompt property to agent identity data model ([520c835](https://github.com/warpdotdev/oz-sdk-python/commit/520c8350b5b7850242adc082fe83a7ae666e6da6))
13+
* **api:** api update ([b8306ad](https://github.com/warpdotdev/oz-sdk-python/commit/b8306ad8aff3c8e83f3c9549a8d78a1dfe22e7f5))
14+
* **api:** api update ([a66cdc2](https://github.com/warpdotdev/oz-sdk-python/commit/a66cdc2b99686872998efe8592b21bb14c6320cc))
15+
* **api:** api update ([da1ee9c](https://github.com/warpdotdev/oz-sdk-python/commit/da1ee9c25078cfbf6fb34e6e3afd09edcfe6b76b))
16+
* **api:** api update ([32f77e1](https://github.com/warpdotdev/oz-sdk-python/commit/32f77e19c7bd30dbeacb84ce95f5e487a7c9debf))
17+
* **api:** api update ([7ec4ab4](https://github.com/warpdotdev/oz-sdk-python/commit/7ec4ab432f4a3e6494d29d7db0b9bf3a08ba0885))
18+
* **api:** api update ([c05564a](https://github.com/warpdotdev/oz-sdk-python/commit/c05564aa69ba70685b6778859b0574f1d2d69a33))
19+
* **api:** api update ([0976362](https://github.com/warpdotdev/oz-sdk-python/commit/09763624c5e172aa28fa43ed18bc0e391c04331d))
20+
* **api:** api update ([96d640c](https://github.com/warpdotdev/oz-sdk-python/commit/96d640cd68290e1a915fca51a8629cf9dab4d81d))
21+
* **api:** api update ([2730eea](https://github.com/warpdotdev/oz-sdk-python/commit/2730eea19d91df998de5ef1b5da4989670a5889a))
22+
* **api:** api update ([af81ef3](https://github.com/warpdotdev/oz-sdk-python/commit/af81ef3a2d48f378209cf69a3074997cb02b1b6c))
23+
* **api:** api update ([99b2d31](https://github.com/warpdotdev/oz-sdk-python/commit/99b2d31ba1a4c2c3d79fc11c5eb8d611c55613b8))
24+
* Codex auth: API key support. ([cb84f0c](https://github.com/warpdotdev/oz-sdk-python/commit/cb84f0c6c9625d8c0657c728d5fadae065eb37c9))
25+
* **internal/types:** support eagerly validating pydantic iterators ([a588f0e](https://github.com/warpdotdev/oz-sdk-python/commit/a588f0e5ba27503659b5abf01d0ebc01f652950d))
26+
* **memory:** agent identity memory store attachments — API layer ([94b5348](https://github.com/warpdotdev/oz-sdk-python/commit/94b5348152c6b0bfb03b0d3887366c4a65e397fb))
27+
* **memory:** wire memory stores into run pipeline and add listing endpoint ([6bb74c2](https://github.com/warpdotdev/oz-sdk-python/commit/6bb74c2b695cd268fe8466fc6099f082370ba54e))
28+
* Partial support for multiple skills per run ([e39df48](https://github.com/warpdotdev/oz-sdk-python/commit/e39df4831329c75d13b7638a2edc146a0a2f57a1))
29+
* Resolve Bedrock region server-side and ship as AWS_REGION ([cef2591](https://github.com/warpdotdev/oz-sdk-python/commit/cef25915ca886a87aa5d567d1e3001ca746c8960))
30+
* Retrieve memories in third party harnesses ([7689e12](https://github.com/warpdotdev/oz-sdk-python/commit/7689e121d6f22efad3d81828721f8ed900b9cd28))
31+
* Support service account impersonation in GCP Workload Identity Federation config ([6df1722](https://github.com/warpdotdev/oz-sdk-python/commit/6df1722325b8c96d7655348e75bd82980e2bd055))
32+
33+
34+
### Bug Fixes
35+
36+
* **client:** add missing f-string prefix in file type error message ([17a8e5b](https://github.com/warpdotdev/oz-sdk-python/commit/17a8e5bf17b882a440a067fee1569caf679f8b55))
37+
338
## 0.12.0 (2026-05-07)
439

540
Full Changelog: [v0.11.0...v0.12.0](https://github.com/warpdotdev/oz-sdk-python/compare/v0.11.0...v0.12.0)

api.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ Methods:
9494
- <code title="put /agent/identities/{uid}">client.agent.agent.<a href="./src/oz_agent_sdk/resources/agent/agent_.py">update</a>(uid, \*\*<a href="src/oz_agent_sdk/types/agent/agent_update_params.py">params</a>) -> <a href="./src/oz_agent_sdk/types/agent/agent_response.py">AgentResponse</a></code>
9595
- <code title="get /agent/identities">client.agent.agent.<a href="./src/oz_agent_sdk/resources/agent/agent_.py">list</a>() -> <a href="./src/oz_agent_sdk/types/agent/list_agent_identities_response.py">ListAgentIdentitiesResponse</a></code>
9696
- <code title="delete /agent/identities/{uid}">client.agent.agent.<a href="./src/oz_agent_sdk/resources/agent/agent_.py">delete</a>(uid) -> None</code>
97+
- <code title="get /agent/identities/{uid}">client.agent.agent.<a href="./src/oz_agent_sdk/resources/agent/agent_.py">get</a>(uid) -> <a href="./src/oz_agent_sdk/types/agent/agent_response.py">AgentResponse</a></code>
9798

9899
## Sessions
99100

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "oz-agent-sdk"
3-
version = "0.12.0"
3+
version = "0.13.0"
44
description = "The official Python library for the oz-api API"
55
dynamic = ["readme"]
66
license = "Apache-2.0"

src/oz_agent_sdk/_files.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ async def async_to_httpx_files(files: RequestFiles | None) -> HttpxRequestFiles
9999
elif is_sequence_t(files):
100100
files = [(key, await _async_transform_file(file)) for key, file in files]
101101
else:
102-
raise TypeError("Unexpected file type input {type(files)}, expected mapping or sequence")
102+
raise TypeError(f"Unexpected file type input {type(files)}, expected mapping or sequence")
103103

104104
return files
105105

src/oz_agent_sdk/_models.py

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@
2525
ClassVar,
2626
Protocol,
2727
Required,
28+
Annotated,
2829
ParamSpec,
30+
TypeAlias,
2931
TypedDict,
3032
TypeGuard,
3133
final,
@@ -79,7 +81,15 @@
7981
from ._constants import RAW_RESPONSE_HEADER
8082

8183
if TYPE_CHECKING:
84+
from pydantic import GetCoreSchemaHandler, ValidatorFunctionWrapHandler
85+
from pydantic_core import CoreSchema, core_schema
8286
from pydantic_core.core_schema import ModelField, ModelSchema, LiteralSchema, ModelFieldsSchema
87+
else:
88+
try:
89+
from pydantic_core import CoreSchema, core_schema
90+
except ImportError:
91+
CoreSchema = None
92+
core_schema = None
8393

8494
__all__ = ["BaseModel", "GenericModel"]
8595

@@ -396,6 +406,76 @@ def model_dump_json(
396406
)
397407

398408

409+
class _EagerIterable(list[_T], Generic[_T]):
410+
"""
411+
Accepts any Iterable[T] input (including generators), consumes it
412+
eagerly, and validates all items upfront.
413+
414+
Validation preserves the original container type where possible
415+
(e.g. a set[T] stays a set[T]). Serialization (model_dump / JSON)
416+
always emits a list — round-tripping through model_dump() will not
417+
restore the original container type.
418+
"""
419+
420+
@classmethod
421+
def __get_pydantic_core_schema__(
422+
cls,
423+
source_type: Any,
424+
handler: GetCoreSchemaHandler,
425+
) -> CoreSchema:
426+
(item_type,) = get_args(source_type) or (Any,)
427+
item_schema: CoreSchema = handler.generate_schema(item_type)
428+
list_of_items_schema: CoreSchema = core_schema.list_schema(item_schema)
429+
430+
return core_schema.no_info_wrap_validator_function(
431+
cls._validate,
432+
list_of_items_schema,
433+
serialization=core_schema.plain_serializer_function_ser_schema(
434+
cls._serialize,
435+
info_arg=False,
436+
),
437+
)
438+
439+
@staticmethod
440+
def _validate(v: Iterable[_T], handler: "ValidatorFunctionWrapHandler") -> Any:
441+
original_type: type[Any] = type(v)
442+
443+
# Normalize to list so list_schema can validate each item
444+
if isinstance(v, list):
445+
items: list[_T] = v
446+
else:
447+
try:
448+
items = list(v)
449+
except TypeError as e:
450+
raise TypeError("Value is not iterable") from e
451+
452+
# Validate items against the inner schema
453+
validated: list[_T] = handler(items)
454+
455+
# Reconstruct original container type
456+
if original_type is list:
457+
return validated
458+
# str(list) produces the list's repr, not a string built from items,
459+
# so skip reconstruction for str and its subclasses.
460+
if issubclass(original_type, str):
461+
return validated
462+
try:
463+
return original_type(validated)
464+
except (TypeError, ValueError):
465+
# If the type cannot be reconstructed, just return the validated list
466+
return validated
467+
468+
@staticmethod
469+
def _serialize(v: Iterable[_T]) -> list[_T]:
470+
"""Always serialize as a list so Pydantic's JSON encoder is happy."""
471+
if isinstance(v, list):
472+
return v
473+
return list(v)
474+
475+
476+
EagerIterable: TypeAlias = Annotated[Iterable[_T], _EagerIterable]
477+
478+
399479
def _construct_field(value: object, field: FieldInfo, key: str) -> object:
400480
if value is None:
401481
return field_get_default(field)

0 commit comments

Comments
 (0)