From 1284046585d20374b6f94c05393ed468bf45a5b4 Mon Sep 17 00:00:00 2001 From: scalarbot Date: Fri, 23 Oct 2026 17:24:54 +0000 Subject: [PATCH 1/2] feat(api)!: update schema agent_options_input (+7 more changes) - Regenerated with generator `0.36.9` (previously `0.36.8`). - Added optional query param `includeStacks` to `pullRequests.list`. - Added optional query param `createdAfter` to `billing.listUsage`. - Added optional query param `createdBefore` to `billing.listUsage`. - Added optional query param `createdBy` to `billing.listUsage`. - Added optional query param `models` to `billing.listUsage`. - Schema `agent_options_input` shape changed. - Added optional property `agent_options.ultracode`. BREAKING CHANGE: Schema `agent_options_input` shape changed. Build: KWZNDosMx3pEP5x8hTZid --- .github/workflows/release-title-edit.yml | 138 ++++++------------- VERSIONING.md | 7 +- scalar-sdk.manifest.json | 66 ++++++++- src/tembo/_version.py | 2 +- src/tembo/resources/billing.py | 40 +++++- src/tembo/resources/pull_requests.py | 6 + src/tembo/types/agent_options_input.py | 3 + src/tembo/types/agent_options_input_param.py | 3 + src/tembo/types/billing_list_usage_params.py | 15 ++ src/tembo/types/pull_request_list_params.py | 3 + src/tembo/types/runtime_list_response.py | 3 + src/tembo/types/session_create_params.py | 3 + src/tembo/types/session_update_params.py | 3 + tests/smoke-test.py | 15 +- 14 files changed, 199 insertions(+), 108 deletions(-) diff --git a/.github/workflows/release-title-edit.yml b/.github/workflows/release-title-edit.yml index c836f65b..08b0ba43 100644 --- a/.github/workflows/release-title-edit.yml +++ b/.github/workflows/release-title-edit.yml @@ -2,14 +2,17 @@ name: Release PR Version on: # `edited` is not one of the default pull_request types, but it is the point of this - # workflow: retitling the release PR is how a maintainer picks an exact version. The - # other types keep the consistency check attached to the PR as it evolves. + # workflow: retitling the release PR is how a maintainer picks an exact version, and the + # check has to re-run on the new title. The other types keep the consistency check attached + # to the PR as it evolves. pull_request: types: [opened, reopened, edited, synchronize] -# Read-only by default; only the job that pushes the Release-As commit widens this. +# Read-only: the check reads the committed version, and polls the pull request while it waits +# for a re-render. permissions: contents: read + pull-requests: read jobs: version-consistency: @@ -25,30 +28,39 @@ jobs: # typo'd into the title still reaches the script and fails there, rather than falling out # of the guard and leaving no check at all — a missing check is not a failing one, and this # is the check the release PR's footer tells maintainers to wait for before merging. - # - # It is also what keeps the workflow from failing silently if the platform ever opens - # release PRs from a different account: the bridge below stops firing, but this check still - # runs, the retitled version and the committed one disagree, and it turns red. The merge is - # blocked loudly instead of releasing the old version. if: >- ${{ github.event.pull_request.base.ref == 'main' && startsWith(github.event.pull_request.title, 'release: ') }} runs-on: ubuntu-latest + # Bounds the wait below with room to spare; a re-render normally lands within a minute. + timeout-minutes: 15 steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: # The version committed on the PR head is what merging would actually release. ref: ${{ github.event.pull_request.head.sha }} - # Fails while the title version and the committed version disagree — the window between - # a maintainer's retitle and the platform re-rendering the PR from it. Without this a - # merge in that window would tag a release whose own files self-report the old version, - # and a title release-please cannot parse would silently cut no release at all. + # A retitle is applied by the Scalar platform, which pushes a Release-As commit to the + # integration branch and re-renders the release PR at that version. Until it lands, the + # title and the committed version disagree, and a merge in that window would tag a release + # whose own files self-report the old version. + # + # So this waits rather than failing: the check stays pending, which blocks a merge just as + # a failure would where the check is required, but does not flash red on every retitle. It + # passes once the title and the committed version agree, and hands over once the head + # moves, since the re-render's push starts a run of its own on the new head. It never + # passes while the title still disagrees, even a newer title: the run started for that + # edit judges it, and a pass here would sit beside it on the same head. Only a re-render + # that never arrives, or a title that is not a version at all, fails it. - name: Compare the title version with the committed version env: # The title is human input, so it is bound through the environment (never # interpolated into the script) and matched against a strict semver pattern # before it is read. PR_TITLE: ${{ github.event.pull_request.title }} + HEAD_SHA: ${{ github.event.pull_request.head.sha }} + PR_NUMBER: ${{ github.event.pull_request.number }} + REPOSITORY: ${{ github.repository }} + GH_TOKEN: ${{ github.token }} run: | pattern='^release: ((0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(-[0-9A-Za-z.-]+)?(\+[0-9A-Za-z.-]+)?)$' if [[ ! "$PR_TITLE" =~ $pattern ]]; then @@ -57,87 +69,25 @@ jobs: fi title_version="${BASH_REMATCH[1]}" manifest_version="$(jq -r '.["."]' .release-please-manifest.json)" - if [[ "$title_version" != "$manifest_version" ]]; then - echo "::error::Release PR title says $title_version but the pull request is versioned $manifest_version. Wait for the release PR to be re-rendered at $title_version before merging." - exit 1 - fi - echo "Release PR title and committed version agree on $title_version." - - apply-title-version: - name: Apply edited release version - # A human retitle of the open release PR is bridged into the canonical explicit-version - # mechanism (a Release-As commit on scalar-next, which the platform re-renders the - # release PR from). `changes.title` is only set when the title itself changed, and bot - # senders are ignored so the platform's own retitles cannot bounce back into another - # commit. - # - # Both signals are required here, unlike the read-only check above, and each covers what the - # other cannot. The author, because this job pushes with `contents: write` and a title is - # free text — anyone able to open a pull request against main could otherwise - # name a version and have it committed to scalar-next. `user.login` is set by GitHub when - # the pull request is opened and cannot be forged by whoever edits the title afterwards. - # The title, because those accounts open pull requests other than release PRs, and retitling - # one of those must not push a release. - # - # One login per platform deployment, since a repo generated by staging carries staging's - # app. Parenthesised because the group is ANDed with the title clause below: without the - # parens that `&&` would bind to the last login alone, letting the other accounts push a - # release off any title. Listed rather than matched on the shared `scalar-docs` stem — a - # prefix test would also admit any future `scalar-docs-*[bot]`, including someone else's. - if: >- - ${{ github.event.action == 'edited' - && github.event.changes.title != null - && github.event.sender.type != 'Bot' - && github.event.pull_request.state == 'open' - && github.event.pull_request.base.ref == 'main' - && (github.event.pull_request.user.login == 'scalar-docs[bot]' - || github.event.pull_request.user.login == 'scalar-docs-staging[bot]' - || github.event.pull_request.user.login == 'scalar-docs-development[bot]') - && startsWith(github.event.pull_request.title, 'release: ') }} - # One bridge run at a time per pull request, newest retitle wins. Two retitles in quick - # succession (a version typo corrected seconds later) would otherwise start two runs that - # both read the version committed on the PR head, both get past the no-op guard, and both - # push — and since each fetches scalar-next immediately before committing, the second - # push fast-forwards instead of failing. release-please honours the newest Release-As - # footer, so the release would land on whichever run happened to push last, not on the - # title the maintainer actually left behind. - concurrency: - group: release-title-edit-${{ github.event.pull_request.number }} - cancel-in-progress: true - runs-on: ubuntu-latest - permissions: - contents: write - steps: - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - # The PR head, so the version the pull request currently carries can be read before - # deciding whether anything needs to change. - ref: ${{ github.event.pull_request.head.sha }} - - name: Push a Release-As commit for the edited version - env: - PR_TITLE: ${{ github.event.pull_request.title }} - run: | - set -euo pipefail - pattern='^release: ((0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(-[0-9A-Za-z.-]+)?(\+[0-9A-Za-z.-]+)?)$' - if [[ ! "$PR_TITLE" =~ $pattern ]]; then - echo "::error::Release PR title must be \"release: X.Y.Z\" with a full semver version, got: $PR_TITLE" - exit 1 - fi - # Only ever a validated semver from here on, so it is safe in a commit message. - version="${BASH_REMATCH[1]}" - manifest_version="$(jq -r '.["."]' .release-please-manifest.json)" - # The re-rendered PR is retitled to the version it now carries; stopping here keeps - # that from producing an endless chain of Release-As commits. - if [[ "$version" == "$manifest_version" ]]; then - echo "This release PR already carries $version; nothing to do." + if [[ "$title_version" == "$manifest_version" ]]; then + echo "Release PR title and committed version agree on $title_version." exit 0 fi - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git fetch origin scalar-next - git checkout -B scalar-next origin/scalar-next - git commit --allow-empty -m "chore: release $version" -m "Release-As: $version" - # Plain (non-force) push: losing a race against a regeneration push fails loudly - # rather than discarding it, and the retitle can simply be repeated. - git push origin scalar-next - echo "Pushed Release-As: $version to scalar-next. The release PR will be re-rendered at that version." + echo "Release PR title says $title_version but the pull request is versioned $manifest_version. Waiting for it to be re-rendered at $title_version." + # Up to ten minutes: 60 polls, 10 seconds apart. + for _ in $(seq 60); do + sleep 10 + # A failed read is retried on the next poll rather than failing the check. + current="$(gh api "repos/$REPOSITORY/pulls/$PR_NUMBER" --jq '[.head.sha, .title] | @tsv')" || continue + IFS=$'\t' read -r current_sha current_title <<< "$current" + if [[ "$current_sha" != "$HEAD_SHA" ]]; then + echo "The release PR has a new head; the run for that push checks it." + exit 0 + fi + if [[ "$current_title" =~ $pattern && "${BASH_REMATCH[1]}" == "$manifest_version" ]]; then + echo "Release PR title and committed version agree on $manifest_version." + exit 0 + fi + done + echo "::error::Release PR title says $title_version but the pull request is still versioned $manifest_version after 10 minutes. Rebuild the SDK from the Scalar dashboard to re-render it." + exit 1 diff --git a/VERSIONING.md b/VERSIONING.md index f9cf7dda..dcde77a5 100644 --- a/VERSIONING.md +++ b/VERSIONING.md @@ -36,12 +36,13 @@ not have picked — **edit the release PR title** to the version you want: release: 1.0.0 ``` -The `Release PR version` check turns red as soon as you save, because the version in the +The `Release PR version` check goes pending as soon as you save, because the version in the title no longer matches the version committed in the PR. The Scalar platform then re-renders the release PR at your version (changelog, manifest, and every version-bearing file), the title comes back as `release: 1.0.0`, and the check turns green. **Wait for it to be green before merging** — merging in between would tag a release whose own files still carry the -old version. +old version. The check only turns red if the title is not a full semver version, or if the +re-render has not arrived within 10 minutes. The git-native equivalent, if you would rather not touch the PR: push an empty commit with a `Release-As` footer to `scalar-next`. This is exactly what the title edit does for you. @@ -95,6 +96,6 @@ Releases work without this; it closes a window where one can go out at the wrong - **If this repository uses auto-merge, make the `Release PR version` check a required status check.** Auto-merge merges as soon as the checks that are *required* go green, with no - human present — so a check that is not required but still red at that moment stops + human present — so a check that is not required but still pending at that moment stops nothing, which is exactly the window between retitling a release PR and the platform re-rendering it. diff --git a/scalar-sdk.manifest.json b/scalar-sdk.manifest.json index c8a80a45..8ea464b3 100644 --- a/scalar-sdk.manifest.json +++ b/scalar-sdk.manifest.json @@ -1,7 +1,7 @@ { "name": "TemboSdk", "slug": "temboSdk", - "generatorVersion": "0.36.8", + "generatorVersion": "0.36.9", "servers": [ "https://api.tembo.io/" ], @@ -848,6 +848,16 @@ ], "additionalProperties": false } + }, + { + "name": "ultracode", + "publicName": "ultracode", + "required": false, + "deprecated": false, + "type": { + "kind": "primitive", + "type": "boolean" + } } ], "additionalProperties": { @@ -966,6 +976,16 @@ ], "additionalProperties": false } + }, + { + "name": "ultracode", + "publicName": "ultracode", + "required": false, + "deprecated": false, + "type": { + "kind": "primitive", + "type": "boolean" + } } ], "additionalProperties": false @@ -22144,6 +22164,7 @@ "hasTemboSession", "includeAuthors", "includeTotal", + "includeStacks", "repositoryIds", "reviewerIds", "mergedAfter", @@ -22164,6 +22185,7 @@ "hasTemboSession", "includeAuthors", "includeTotal", + "includeStacks", "repositoryIds", "reviewerIds", "mergedAfter", @@ -22246,6 +22268,12 @@ "style": "form", "explode": true }, + { + "name": "includeStacks", + "required": false, + "style": "form", + "explode": true + }, { "name": "repositoryIds", "required": false, @@ -29503,12 +29531,20 @@ "queryParams": [ "cursor", "limit", - "sessionId" + "sessionId", + "createdAfter", + "createdBefore", + "createdBy", + "models" ], "publicQueryParams": [ "cursor", "limit", - "sessionId" + "sessionId", + "createdAfter", + "createdBefore", + "createdBy", + "models" ], "headerParams": [], "publicHeaderParams": [], @@ -29535,6 +29571,30 @@ "required": false, "style": "form", "explode": true + }, + { + "name": "createdAfter", + "required": false, + "style": "form", + "explode": true + }, + { + "name": "createdBefore", + "required": false, + "style": "form", + "explode": true + }, + { + "name": "createdBy", + "required": false, + "style": "form", + "explode": true + }, + { + "name": "models", + "required": false, + "style": "form", + "explode": true } ], "headerParamDetails": [], diff --git a/src/tembo/_version.py b/src/tembo/_version.py index 15f97f3a..3e9326a7 100644 --- a/src/tembo/_version.py +++ b/src/tembo/_version.py @@ -1,4 +1,4 @@ # File generated from our OpenAPI spec by Scalar. See README.md for details. __title__ = "temboSdk" -__version__ = "0.3.0" # x-release-please-version +__version__ = "0.4.0" # x-release-please-version diff --git a/src/tembo/resources/billing.py b/src/tembo/resources/billing.py index 29cc97c2..89745354 100644 --- a/src/tembo/resources/billing.py +++ b/src/tembo/resources/billing.py @@ -4,6 +4,10 @@ import httpx +from typing import Union +from datetime import datetime +from .._types import SequenceNotStr + from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given from .._utils import maybe_transform, async_maybe_transform from .._compat import cached_property @@ -72,6 +76,10 @@ def list_usage( cursor: str | Omit = omit, limit: int | Omit = omit, session_id: str | Omit = omit, + created_after: Union[str, datetime] | Omit = omit, + created_before: Union[str, datetime] | Omit = omit, + created_by: SequenceNotStr[str] | Omit = omit, + models: SequenceNotStr[str] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. extra_headers: Headers | None = None, @@ -86,6 +94,10 @@ def list_usage( cursor: Continuation cursor from the previous response nextCursor. Omit for the first page; null nextCursor means there are no more pages. limit: Maximum number of items to return in one page. Use nextCursor from the response to fetch more items. session_id: Filter billing usage to this session. + created_after: Only sessions created at or after this ISO 8601 timestamp. + created_before: Only sessions created before this ISO 8601 timestamp. + created_by: Filter by creator IDs, supplied as a comma-separated list. + models: Filter by model names, supplied as a comma-separated list. extra_headers: Send extra headers with the request. extra_query: Send extra query parameters with the request. extra_body: Send extra JSON properties with the request. @@ -109,7 +121,15 @@ def list_usage( extra_body=extra_body, timeout=timeout, query=maybe_transform( - {"cursor": cursor, "limit": limit, "session_id": session_id}, + { + "cursor": cursor, + "limit": limit, + "session_id": session_id, + "created_after": created_after, + "created_before": created_before, + "created_by": created_by, + "models": models, + }, billing_list_usage_params.BillingListUsageParams, ), ), @@ -167,6 +187,10 @@ async def list_usage( cursor: str | Omit = omit, limit: int | Omit = omit, session_id: str | Omit = omit, + created_after: Union[str, datetime] | Omit = omit, + created_before: Union[str, datetime] | Omit = omit, + created_by: SequenceNotStr[str] | Omit = omit, + models: SequenceNotStr[str] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. extra_headers: Headers | None = None, @@ -181,6 +205,10 @@ async def list_usage( cursor: Continuation cursor from the previous response nextCursor. Omit for the first page; null nextCursor means there are no more pages. limit: Maximum number of items to return in one page. Use nextCursor from the response to fetch more items. session_id: Filter billing usage to this session. + created_after: Only sessions created at or after this ISO 8601 timestamp. + created_before: Only sessions created before this ISO 8601 timestamp. + created_by: Filter by creator IDs, supplied as a comma-separated list. + models: Filter by model names, supplied as a comma-separated list. extra_headers: Send extra headers with the request. extra_query: Send extra query parameters with the request. extra_body: Send extra JSON properties with the request. @@ -204,7 +232,15 @@ async def list_usage( extra_body=extra_body, timeout=timeout, query=await async_maybe_transform( - {"cursor": cursor, "limit": limit, "session_id": session_id}, + { + "cursor": cursor, + "limit": limit, + "session_id": session_id, + "created_after": created_after, + "created_before": created_before, + "created_by": created_by, + "models": models, + }, billing_list_usage_params.BillingListUsageParams, ), ), diff --git a/src/tembo/resources/pull_requests.py b/src/tembo/resources/pull_requests.py index 1cdad3da..8012209b 100644 --- a/src/tembo/resources/pull_requests.py +++ b/src/tembo/resources/pull_requests.py @@ -50,6 +50,7 @@ def list( has_tembo_session: bool | Omit = omit, include_authors: bool | Omit = omit, include_total: bool | Omit = omit, + include_stacks: bool | Omit = omit, repository_ids: SequenceNotStr[str] | Omit = omit, reviewer_ids: SequenceNotStr[str] | Omit = omit, merged_after: Union[str, datetime] | Omit = omit, @@ -79,6 +80,7 @@ def list( has_tembo_session: When true, only return pull requests with a linked Tembo session. include_authors: Request author filter options. Public responses do not include organization-wide author options. include_total: Include the total count of matching pull requests. + include_stacks: Include each open pull request's position in its stack of dependent pull requests. Public responses do not include stacks. repository_ids: Filter by repository IDs, supplied as a comma-separated list. reviewer_ids: Filter by assigned reviewer identifiers, supplied as a comma-separated list. merged_after: Only pull requests merged after this ISO 8601 timestamp. @@ -121,6 +123,7 @@ def list( "has_tembo_session": has_tembo_session, "include_authors": include_authors, "include_total": include_total, + "include_stacks": include_stacks, "repository_ids": repository_ids, "reviewer_ids": reviewer_ids, "merged_after": merged_after, @@ -200,6 +203,7 @@ async def list( has_tembo_session: bool | Omit = omit, include_authors: bool | Omit = omit, include_total: bool | Omit = omit, + include_stacks: bool | Omit = omit, repository_ids: SequenceNotStr[str] | Omit = omit, reviewer_ids: SequenceNotStr[str] | Omit = omit, merged_after: Union[str, datetime] | Omit = omit, @@ -229,6 +233,7 @@ async def list( has_tembo_session: When true, only return pull requests with a linked Tembo session. include_authors: Request author filter options. Public responses do not include organization-wide author options. include_total: Include the total count of matching pull requests. + include_stacks: Include each open pull request's position in its stack of dependent pull requests. Public responses do not include stacks. repository_ids: Filter by repository IDs, supplied as a comma-separated list. reviewer_ids: Filter by assigned reviewer identifiers, supplied as a comma-separated list. merged_after: Only pull requests merged after this ISO 8601 timestamp. @@ -271,6 +276,7 @@ async def list( "has_tembo_session": has_tembo_session, "include_authors": include_authors, "include_total": include_total, + "include_stacks": include_stacks, "repository_ids": repository_ids, "reviewer_ids": reviewer_ids, "merged_after": merged_after, diff --git a/src/tembo/types/agent_options_input.py b/src/tembo/types/agent_options_input.py index 9a779462..a80c3910 100644 --- a/src/tembo/types/agent_options_input.py +++ b/src/tembo/types/agent_options_input.py @@ -29,6 +29,9 @@ class AgentOptionsInput2(BaseModel): goal: Optional[AgentOptionsInput2Goal] = None + ultracode: Optional[bool] = None + """Whether the agent orchestrates multi-agent workflows for every task when supported by the selected runtime and model.""" + if TYPE_CHECKING: # Some versions of Pydantic <2.8.0 have a bug and don’t allow assigning a # value to this field, so for compatibility we avoid doing it at runtime. diff --git a/src/tembo/types/agent_options_input_param.py b/src/tembo/types/agent_options_input_param.py index 63643ae6..5af9bc39 100644 --- a/src/tembo/types/agent_options_input_param.py +++ b/src/tembo/types/agent_options_input_param.py @@ -27,5 +27,8 @@ class Variant(TypedDict, total=False): goal: VariantGoal + ultracode: bool + """Whether the agent orchestrates multi-agent workflows for every task when supported by the selected runtime and model.""" + AgentOptionsInputParam: TypeAlias = Union[Variant, Dict[str, object]] diff --git a/src/tembo/types/billing_list_usage_params.py b/src/tembo/types/billing_list_usage_params.py index 0afef5be..60cf6b3f 100644 --- a/src/tembo/types/billing_list_usage_params.py +++ b/src/tembo/types/billing_list_usage_params.py @@ -2,7 +2,10 @@ from __future__ import annotations +from typing import Union +from datetime import datetime from typing_extensions import Annotated, TypedDict +from .._types import SequenceNotStr from .._utils import PropertyInfo @@ -18,3 +21,15 @@ class BillingListUsageParams(TypedDict, total=False): session_id: Annotated[str, PropertyInfo(alias="sessionId")] """Filter billing usage to this session.""" + + created_after: Annotated[Union[str, datetime], PropertyInfo(alias="createdAfter", format="iso8601")] + """Only sessions created at or after this ISO 8601 timestamp.""" + + created_before: Annotated[Union[str, datetime], PropertyInfo(alias="createdBefore", format="iso8601")] + """Only sessions created before this ISO 8601 timestamp.""" + + created_by: Annotated[SequenceNotStr[str], PropertyInfo(alias="createdBy")] + """Filter by creator IDs, supplied as a comma-separated list.""" + + models: SequenceNotStr[str] + """Filter by model names, supplied as a comma-separated list.""" diff --git a/src/tembo/types/pull_request_list_params.py b/src/tembo/types/pull_request_list_params.py index d13ea342..71b980da 100644 --- a/src/tembo/types/pull_request_list_params.py +++ b/src/tembo/types/pull_request_list_params.py @@ -46,6 +46,9 @@ class PullRequestListParams(TypedDict, total=False): include_total: Annotated[bool, PropertyInfo(alias="includeTotal")] """Include the total count of matching pull requests.""" + include_stacks: Annotated[bool, PropertyInfo(alias="includeStacks")] + """Include each open pull request's position in its stack of dependent pull requests. Public responses do not include stacks.""" + repository_ids: Annotated[SequenceNotStr[str], PropertyInfo(alias="repositoryIds")] """Filter by repository IDs, supplied as a comma-separated list.""" diff --git a/src/tembo/types/runtime_list_response.py b/src/tembo/types/runtime_list_response.py index 291bb114..1cabaaef 100644 --- a/src/tembo/types/runtime_list_response.py +++ b/src/tembo/types/runtime_list_response.py @@ -130,6 +130,9 @@ class ItemRunCapabilities(BaseModel): supports_goals: bool = FieldInfo(alias="supportsGoals") + ultracode_models: List[str] = FieldInfo(alias="ultracodeModels") + """Models that support ultracode workflow orchestration.""" + class Item(BaseModel): name: Literal["claudeCode", "codex", "opencode", "cursor", "amp", "fx", "pi"] diff --git a/src/tembo/types/session_create_params.py b/src/tembo/types/session_create_params.py index 9528d781..705d3f48 100644 --- a/src/tembo/types/session_create_params.py +++ b/src/tembo/types/session_create_params.py @@ -103,6 +103,9 @@ class AgentOptions(TypedDict, total=False): goal: AgentOptionsGoal + ultracode: bool + """Whether the agent orchestrates multi-agent workflows for every task when supported by the selected runtime and model.""" + from .session_document_node_param import SessionDocumentNodeParam from .tip_tap_document_param import TipTapDocumentParam diff --git a/src/tembo/types/session_update_params.py b/src/tembo/types/session_update_params.py index b9368cdf..a1c7a02c 100644 --- a/src/tembo/types/session_update_params.py +++ b/src/tembo/types/session_update_params.py @@ -93,6 +93,9 @@ class AgentOptions(TypedDict, total=False): goal: AgentOptionsGoal + ultracode: bool + """Whether the agent orchestrates multi-agent workflows for every task when supported by the selected runtime and model.""" + from .session_document_node_param import SessionDocumentNodeParam from .tip_tap_document_param import TipTapDocumentParam diff --git a/tests/smoke-test.py b/tests/smoke-test.py index 8053cbbe..df794265 100644 --- a/tests/smoke-test.py +++ b/tests/smoke-test.py @@ -586,7 +586,7 @@ def _smoke_case_67() -> None: mcp_servers=["x"], pull_request_id="7c9e6679-7425-40de-944b-e07fc1f90ae7", session_id="7c9e6679-7425-40de-944b-e07fc1f90ae7", - agent_options={"reasoning_level": "x", "mode": "normal", "speed": "normal", "goal": {}}, + agent_options={"reasoning_level": "x", "mode": "normal", "speed": "normal", "goal": {}, "ultracode": False}, delivery_mode="queue", rich_content={ "type": "doc", @@ -866,7 +866,7 @@ def _smoke_case_96() -> None: sandbox_size="nano", target_branch="main", visibility="private", - agent_options={"reasoning_level": "x", "mode": "normal", "speed": "normal", "goal": {}}, + agent_options={"reasoning_level": "x", "mode": "normal", "speed": "normal", "goal": {}, "ultracode": False}, branch_name="x", code_repository_ids=["123e4567-e89b-12d3-a456-426614174000"], description="Fix the authentication bug in the login component", @@ -895,7 +895,7 @@ def _smoke_case_99() -> None: session = client.sessions.update( session_id="7c9e6679-7425-40de-944b-e07fc1f90ae7", agent="x", - agent_options={"reasoning_level": "x", "mode": "normal", "speed": "normal", "goal": {}}, + agent_options={"reasoning_level": "x", "mode": "normal", "speed": "normal", "goal": {}, "ultracode": False}, base_branch="x", branch_name="x", description="x", @@ -1361,6 +1361,7 @@ def _smoke_case_157() -> None: has_tembo_session=True, include_authors=True, include_total=True, + include_stacks=True, repository_ids=["repository_id"], reviewer_ids=["reviewer_id"], merged_after="2024-01-01T00:00:00.000Z", @@ -1410,7 +1411,7 @@ def _smoke_case_162() -> None: }, mcp_servers=["x"], agent="x", - agent_options={"reasoning_level": "x", "mode": "normal", "speed": "normal", "goal": {}}, + agent_options={"reasoning_level": "x", "mode": "normal", "speed": "normal", "goal": {}, "ultracode": False}, sandbox_size="nano", project_id="7c9e6679-7425-40de-944b-e07fc1f90ae7", artifact_type="PullRequest", @@ -1446,7 +1447,7 @@ def _smoke_case_165() -> None: }, mcp_servers=["x"], agent="x", - agent_options={"reasoning_level": "x", "mode": "normal", "speed": "normal", "goal": {}}, + agent_options={"reasoning_level": "x", "mode": "normal", "speed": "normal", "goal": {}, "ultracode": False}, user_state={}, sandbox_size="nano", project_id="7c9e6679-7425-40de-944b-e07fc1f90ae7", @@ -1940,6 +1941,10 @@ def _smoke_case_228() -> None: cursor="cursor", limit=50, session_id="session_id", + created_after="2024-01-01T00:00:00.000Z", + created_before="2024-01-01T00:00:00.000Z", + created_by=["created_by"], + models=["model"], ) From 95d6c6be3ae76a33b4adbba13c31b983eb666427 Mon Sep 17 00:00:00 2001 From: "scalar-docs[bot]" <148485328+scalar-docs[bot]@users.noreply.github.com> Date: Fri, 23 Oct 2026 17:25:25 +0000 Subject: [PATCH 2/2] release: 0.5.0 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 11 +++++++++++ pyproject.toml | 2 +- src/tembo/_version.py | 2 +- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index da59f99e..2aca35ae 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.4.0" + ".": "0.5.0" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b602d17..7c38f750 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +## [0.5.0](https://github.com/tembo/sdk-python/compare/v0.4.0...v0.5.0) (2026-10-23) + + +### ⚠ BREAKING CHANGES + +* **api:** Schema `agent_options_input` shape changed. + +### Features + +* **api:** update schema agent_options_input (+7 more changes) ([1284046](https://github.com/tembo/sdk-python/commit/1284046585d20374b6f94c05393ed468bf45a5b4)) + ## [0.4.0](https://github.com/tembo/sdk-python/compare/v0.3.0...v0.4.0) (2026-10-21) diff --git a/pyproject.toml b/pyproject.toml index 35c250fc..092b954c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "tembo-sdk-python" -version = "0.4.0" # x-release-please-version +version = "0.5.0" # x-release-please-version description = "Manage agents, sessions, repositories, and organization resources with the Tembo API." readme = "README.md" license = "Apache-2.0" diff --git a/src/tembo/_version.py b/src/tembo/_version.py index 3e9326a7..17fb69dc 100644 --- a/src/tembo/_version.py +++ b/src/tembo/_version.py @@ -1,4 +1,4 @@ # File generated from our OpenAPI spec by Scalar. See README.md for details. __title__ = "temboSdk" -__version__ = "0.4.0" # x-release-please-version +__version__ = "0.5.0" # x-release-please-version