diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml new file mode 100644 index 0000000..3f5e9c1 --- /dev/null +++ b/.github/workflows/release-please.yml @@ -0,0 +1,20 @@ +name: Release Please +on: + push: + branches: + - main + +permissions: + contents: write + pull-requests: write + +jobs: + release-please: + if: github.repository == 'sambanova/sambanova-python' + runs-on: ubuntu-latest + + steps: + - uses: googleapis/release-please-action@5c625bfb5d1ff62eadeeb3772007f7f66fdcf071 # v4.4.1 + id: release + with: + token: ${{ secrets.RELEASE_PLEASE_TOKEN }} diff --git a/.github/workflows/seal-dispatch.yml b/.github/workflows/seal-dispatch.yml new file mode 100644 index 0000000..a217f93 --- /dev/null +++ b/.github/workflows/seal-dispatch.yml @@ -0,0 +1,74 @@ +name: Seal custom code (dispatch) + +# Optional, eager variant of the config repo's scheduled tracking-file sync. +# +# When genuine out-of-band custom code is merged to this SDK repo's `main` +# (a direct staging commit, or a contribution pulled back from production), +# notify the config repo to reseal so the custom-code tracking JSON absorbs it +# promptly instead of waiting for the config repo's poll. stlc-authored commits +# are skipped by the loop guards below, so the bot's own pushes (the "Build SDK" +# squash commit and any regen commit) cannot trigger a reseal loop. +# +# This workflow is itself custom code on the SDK repo: seal it once with +# `stlc build --commit` to bootstrap, after which scaffold preservation keeps it +# across regenerations. If you would rather keep things simple, drop this file +# and rely on the config repo's scheduled `stlc-sync-tracking.yml` poll alone. +# +# Lives in the STAGING repo. Requires CONFIG_DISPATCH_TOKEN — a token that can +# send a repository_dispatch to the config repo. +on: + push: + # main only. stlc preview/integrated/codegen branches never push to main. + branches: [main] + +concurrency: + group: seal-dispatch-${{ github.ref }} + cancel-in-progress: false + +permissions: + contents: read + +jobs: + dispatch: + runs-on: ubuntu-latest + if: github.repository == 'sambanova/sambanova-python-staging' + env: + CONFIG_REPO: sambanova/sambanova-stlc-config + steps: + - name: Loop-guard and send reseal dispatch + env: + DISPATCH_TOKEN: ${{ secrets.CONFIG_DISPATCH_TOKEN }} + HEAD_MSG: ${{ github.event.head_commit.message }} + HEAD_AUTHOR_NAME: ${{ github.event.head_commit.author.name }} + SHA: ${{ github.sha }} + REPO: ${{ github.repository }} + run: | + set -euo pipefail + + # Loop guard 1: skip the stlc "Build SDK" squash commit (it carries + # the Stainless-Generated-From trailer in its message). + if printf '%s' "$HEAD_MSG" | grep -q 'Stainless-Generated-From'; then + echo "Head commit is an stlc build — skipping reseal dispatch." + exit 0 + fi + + # Loop guard 2: skip stlc-bot commits (e.g. a regen commit). + if [ "$HEAD_AUTHOR_NAME" = "stlc-bot" ]; then + echo "Head commit authored by stlc-bot — skipping reseal dispatch." + exit 0 + fi + + [ -n "${DISPATCH_TOKEN:-}" ] || { echo "CONFIG_DISPATCH_TOKEN not set" >&2; exit 1; } + payload=$(jq -n --arg sha "$SHA" --arg repo "$REPO" \ + '{event_type:"seal-custom-code",client_payload:{target:"all",sha:$sha,repo:$repo}}') + code=$(curl -sS -o /tmp/dispatch.txt -w '%{http_code}' -X POST \ + -H "Authorization: Bearer ${DISPATCH_TOKEN}" \ + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + "https://api.github.com/repos/${CONFIG_REPO}/dispatches" \ + -d "$payload") + if [ "$code" = "204" ]; then + echo "Reseal dispatched to ${CONFIG_REPO}." + else + echo "Dispatch failed (HTTP $code)" >&2; cat /tmp/dispatch.txt >&2; exit 1 + fi \ No newline at end of file diff --git a/.github/workflows/stlc-promote.yml b/.github/workflows/stlc-promote.yml new file mode 100644 index 0000000..776cffe --- /dev/null +++ b/.github/workflows/stlc-promote.yml @@ -0,0 +1,88 @@ +name: Promote SDKs + +# Merge-commit PR promote — use this variant only when the PRODUCTION repo +# requires a pull request for changes to `main` (so the fast-forward direct +# push in examples/sdk-repo can't be used on that boundary). If production can +# take a direct push, use the fast-forward promote instead — it's simpler. +# +# This pushes staging `main` to a `stainless/release` branch on production and +# opens a PR. **Merge that PR with a MERGE COMMIT — never squash or rebase.** +# A merge commit keeps staging's commits reachable, so production stays a clean +# descendant of staging and the back-sync still fast-forwards; squash/rebase +# rewrite the SHAs and fork the two trunks apart. +# +# Lives in the STAGING repo. Requires PRODUCTION_REPO_TOKEN with Contents + +# Pull requests: write on the production repo. +on: + push: + branches: [main] + +permissions: + contents: read + +jobs: + promote: + runs-on: ubuntu-latest + if: github.repository == 'sambanova/sambanova-python-staging' + env: + PRODUCTION_REPO: sambanova/sambanova-python + GH_TOKEN: ${{ secrets.PRODUCTION_REPO_TOKEN }} + steps: + - name: Check out staging + uses: actions/checkout@v6 + with: + fetch-depth: 0 + persist-credentials: false + + - name: Fetch production main + run: | + git remote add production \ + "https://x-access-token:${GH_TOKEN}@github.com/${PRODUCTION_REPO}.git" + git fetch production main + + - name: Check whether production already has staging's content + id: diff + run: | + # Compare by CONTENT, not commit SHA. After a release, production + # carries release-please's version/changelog commits that staging + # lacks, so the SHAs always differ — a SHA check would re-open a + # spurious release PR on every push. Ask whether merging staging into + # production would change production's tree: if not, production + # already has everything on staging and there is nothing to release. + MERGED=$(git merge-tree --write-tree production/main origin/main) || MERGED=conflict + PRODUCTION_TREE=$(git rev-parse 'production/main^{tree}') + if [ "$MERGED" = "$PRODUCTION_TREE" ]; then + echo "Production already contains staging's content. Nothing to release." + echo "synced=true" >> "$GITHUB_OUTPUT" + else + echo "synced=false" >> "$GITHUB_OUTPUT" + fi + + - name: Push staging main to the release branch on production + if: steps.diff.outputs.synced == 'false' + run: | + git push production origin/main:refs/heads/stainless/release --force + + - name: Open or update the release PR on production + if: steps.diff.outputs.synced == 'false' + run: | + EXISTING_PR=$(gh pr list \ + --repo "${PRODUCTION_REPO}" \ + --head stainless/release \ + --state open \ + --json number \ + --jq '.[0].number') + if [ -z "${EXISTING_PR}" ]; then + gh pr create \ + --repo "${PRODUCTION_REPO}" \ + --base main \ + --head stainless/release \ + --title "Release SDK updates" \ + --body "$(git log --oneline production/main..origin/main)" + else + echo "Release PR #${EXISTING_PR} already exists. Force-push has updated it." + fi + # Review and merge this PR with a MERGE COMMIT to cut a release. To + # land it automatically instead, enable auto-merge: + # gh pr merge stainless/release --repo "${PRODUCTION_REPO}" --merge --auto + # (--merge = merge commit; do NOT use --squash or --rebase here.) \ No newline at end of file diff --git a/.github/workflows/stlc-sync-from-production.yml b/.github/workflows/stlc-sync-from-production.yml new file mode 100644 index 0000000..0e12128 --- /dev/null +++ b/.github/workflows/stlc-sync-from-production.yml @@ -0,0 +1,89 @@ +name: Sync from production + +# Merge-commit PR back-sync — use this variant only when the STAGING repo +# requires a pull request for changes to `main`. If staging can take a direct +# push, use the fast-forward back-sync in examples/sdk-repo instead. +# +# Pushes production `main` to a `stlc/from-prod` branch on staging and opens a +# PR, then auto-merges it **with a merge commit** (never squash or rebase) so +# staging stays a clean descendant of production and the next `stlc build` +# reseals against the released state. +# +# Lives in the STAGING repo. Reuses PRODUCTION_REPO_TOKEN to read production +# (only needed if production is private; a public repo reads with no token). +on: + schedule: + # A poll, not a release — the eager trigger is trigger-back-sync-on-release. + - cron: '17 */6 * * *' + workflow_dispatch: {} + repository_dispatch: + types: [prod-released] + +permissions: + contents: write # push the back-sync branch on staging + pull-requests: write # open + auto-merge the back-sync PR on staging + +concurrency: + group: stlc-sync-from-production + cancel-in-progress: true + +jobs: + sync: + runs-on: ubuntu-latest + if: github.repository == 'sambanova/sambanova-python-staging' + env: + PRODUCTION_REPO: sambanova/sambanova-python + # The built-in token opens + merges the PR on this (staging) repo. + GH_TOKEN: ${{ github.token }} + steps: + - name: Check out staging + uses: actions/checkout@v6 + with: + fetch-depth: 0 + persist-credentials: false + + - name: Fetch production main + run: | + # Production is public, so the built-in token reads it with no + # credential. If production is private, add the remote with + # PRODUCTION_REPO_TOKEN instead. + git remote add production "https://github.com/${PRODUCTION_REPO}.git" + git fetch production main + + - name: Check whether production has content staging lacks + id: diff + run: | + MERGED=$(git merge-tree --write-tree origin/main production/main) || MERGED=conflict + STAGING_TREE=$(git rev-parse 'origin/main^{tree}') + if [ "$MERGED" = "$STAGING_TREE" ]; then + echo "Staging already has production's content. Nothing to pull back." + echo "behind=false" >> "$GITHUB_OUTPUT" + else + echo "behind=true" >> "$GITHUB_OUTPUT" + fi + + - name: Push production main to the back-sync branch on staging + if: steps.diff.outputs.behind == 'true' + env: + STAGING_PUSH_TOKEN: ${{ secrets.PRODUCTION_REPO_TOKEN }} + run: | + git push "https://x-access-token:${STAGING_PUSH_TOKEN}@github.com/${GITHUB_REPOSITORY}.git" \ + production/main:refs/heads/stlc/from-prod --force + + - name: Open + auto-merge the back-sync PR (merge commit) + if: steps.diff.outputs.behind == 'true' + run: | + EXISTING_PR=$(gh pr list --head stlc/from-prod --base main --state open --json number --jq '.[0].number') + if [ -z "${EXISTING_PR}" ]; then + gh pr create \ + --base main \ + --head stlc/from-prod \ + --title "Sync release changes from production" \ + --body "Pulls production's release-please commits (and any merged contributions) back onto staging \`main\` so the next \`stlc build\` reseals against the released state. Bot-authored; safe to auto-merge." + fi + # --merge = MERGE COMMIT (preserves production's commits as ancestors). + # Never --squash or --rebase here: that would rewrite the SHAs and fork + # the trunks. If your repo gates main on `trunk-synced`, exclude the + # `stlc/from-prod` branch from that check so this PR isn't deadlocked. + gh pr merge stlc/from-prod --merge --auto \ + || echo "Auto-merge unavailable — merge the back-sync PR manually with a merge commit." \ No newline at end of file diff --git a/.github/workflows/trunk-sync-lock.yml b/.github/workflows/trunk-sync-lock.yml new file mode 100644 index 0000000..d6fb71e --- /dev/null +++ b/.github/workflows/trunk-sync-lock.yml @@ -0,0 +1,69 @@ +name: Trunk sync lock + +# Posts a `trunk-synced` commit status to open PRs targeting staging `main`: +# red while production is ahead of staging (a release hasn't been synced back +# yet), green once they are in sync. +# +# You should make `trunk-synced` a required status check on staging `main` +# to block merges onto a stale trunk during the release +# window. +# +# This only gates PRs, not direct pushes. The back-sync bypasses this check +# by pushing to staging `main` directly. If staging `main` also requires a pull +# request, give the back-sync's identity ruleset-bypass so it can push. Never +# route the back-sync through a PR gated by this check, or it deadlocks. +# +# First-run note: GitHub treats a status check as "required" only once it has +# been reported at least once. At setup time staging and production are +# identical, so trigger this workflow once (push a PR or use the Run workflow +# button) BEFORE adding `trunk-synced` to the required checks, so the first +# status is green rather than missing. +on: + pull_request: + branches: [main] + types: [opened, synchronize, reopened] + workflow_run: + workflows: ["Sync from production"] + types: [completed] + repository_dispatch: + types: [prod-released] + workflow_dispatch: {} + schedule: + - cron: '*/30 * * * *' + +permissions: + contents: read + statuses: write + pull-requests: read + +jobs: + lock: + runs-on: ubuntu-latest + if: github.repository == 'sambanova/sambanova-python-staging' + env: + PRODUCTION_REPO: sambanova/sambanova-python + GH_TOKEN: ${{ github.token }} + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + persist-credentials: false + - name: Evaluate sync state and post status to open main PRs + run: | + set -euo pipefail + # Production is public; the built-in token reads it with no credential. + git remote add production "https://github.com/${PRODUCTION_REPO}.git" + git fetch --no-tags production main + if git merge-base --is-ancestor production/main HEAD; then + state=success; desc="staging main is in sync with production" + else + state=failure; desc="production is ahead — wait for the back-sync before merging" + fi + echo "trunk-synced => $state ($desc)" + shas=$(gh pr list --repo "$GITHUB_REPOSITORY" --base main --state open --json headRefOid --jq '.[].headRefOid') + if [ -z "$shas" ]; then echo "no open PRs targeting main"; exit 0; fi + for sha in $shas; do + gh api -X POST "repos/$GITHUB_REPOSITORY/statuses/$sha" \ + -f state="$state" -f context="trunk-synced" -f description="$desc" >/dev/null + echo "posted trunk-synced=$state to $sha" + done \ No newline at end of file diff --git a/.stats.yml b/.stats.yml index 8d7fd5e..af63a6f 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1 @@ configured_endpoints: 10 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sambanova/sambanova-50fb2e3f57f67505e5e7230bf1191aaa021757640fd2c889fe30d5228a240f80.yml -openapi_spec_hash: 3f3793a97a88b742adf346745e57803d -config_hash: 0213fb1509c3d860435ee9a49477d86f diff --git a/scripts/mock b/scripts/mock index feebe5e..650c9fe 100755 --- a/scripts/mock +++ b/scripts/mock @@ -7,14 +7,15 @@ cd "$(dirname "$0")/.." if [[ -n "$1" && "$1" != '--'* ]]; then URL="$1" shift +elif [ -n "$STAINLESS_OPENAPI_SPEC_URL" ]; then + URL="$STAINLESS_OPENAPI_SPEC_URL" else - URL="$(grep 'openapi_spec_url' .stats.yml | cut -d' ' -f2)" -fi - -# Check if the URL is empty -if [ -z "$URL" ]; then - echo "Error: No OpenAPI spec path/url provided or found in .stats.yml" - exit 1 + # Embedded OpenAPI spec (base64-encoded, gzipped) + EMBEDDED_SPEC="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" + SPEC_TMPFILE="$(mktemp)" + trap 'rm -f "$SPEC_TMPFILE"' EXIT + echo "$EMBEDDED_SPEC" | base64 --decode | gunzip > "$SPEC_TMPFILE" + URL="$SPEC_TMPFILE" fi echo "==> Starting mock server with URL ${URL}" diff --git a/scripts/utils/upload-artifact.sh b/scripts/utils/upload-artifact.sh index c22ad62..1ccf036 100755 --- a/scripts/utils/upload-artifact.sh +++ b/scripts/utils/upload-artifact.sh @@ -20,7 +20,7 @@ UPLOAD_RESPONSE=$(curl -v -X PUT \ if echo "$UPLOAD_RESPONSE" | grep -q "HTTP/[0-9.]* 200"; then echo -e "\033[32mUploaded build to Stainless storage.\033[0m" - echo -e "\033[32mInstallation: pip install 'https://pkg.stainless.com/s/sambanova-python/$SHA/$FILENAME'\033[0m" + echo -e "\033[32mInstallation: pip install 'https://pkg.stainless.com/s/sambanova-python-staging/$SHA/$FILENAME'\033[0m" else echo -e "\033[31mFailed to upload artifact.\033[0m" exit 1 diff --git a/src/sambanova/types/chat/completion_create_params.py b/src/sambanova/types/chat/completion_create_params.py index 6db6cde..880de86 100644 --- a/src/sambanova/types/chat/completion_create_params.py +++ b/src/sambanova/types/chat/completion_create_params.py @@ -253,7 +253,11 @@ class CompletionCreateParamsBase(TypedDict, total=False): """ -class MessageSystemMessageContentTextContentPartArray(TypedDict, total=False, extra_items=object): # type: ignore[call-arg] +class MessageSystemMessageContentTextContentPartArray( # type: ignore[call-arg] + TypedDict, + total=False, + extra_items=object, # pyright: ignore[reportGeneralTypeIssues] +): text: Required[str] """string content of the message""" @@ -261,7 +265,11 @@ class MessageSystemMessageContentTextContentPartArray(TypedDict, total=False, ex """type of content to send. in this case `text`.""" -class MessageSystemMessage(TypedDict, total=False, extra_items=object): # type: ignore[call-arg] +class MessageSystemMessage( # type: ignore[call-arg] + TypedDict, + total=False, + extra_items=object, # pyright: ignore[reportGeneralTypeIssues] +): content: Required[Union[str, Iterable[MessageSystemMessageContentTextContentPartArray], None]] """The contents of the system message.""" @@ -269,7 +277,11 @@ class MessageSystemMessage(TypedDict, total=False, extra_items=object): # type: """The role of the messages author, in this case `system`.""" -class MessageUserMessageContentMulticontentPartArrayTextContent(TypedDict, total=False, extra_items=object): # type: ignore[call-arg] +class MessageUserMessageContentMulticontentPartArrayTextContent( # type: ignore[call-arg] + TypedDict, + total=False, + extra_items=object, # pyright: ignore[reportGeneralTypeIssues] +): text: Required[str] """string content of the message""" @@ -285,7 +297,11 @@ class MessageUserMessageContentMulticontentPartArrayImageContentImageURL(TypedDi """ -class MessageUserMessageContentMulticontentPartArrayImageContent(TypedDict, total=False, extra_items=object): # type: ignore[call-arg] +class MessageUserMessageContentMulticontentPartArrayImageContent( # type: ignore[call-arg] + TypedDict, + total=False, + extra_items=object, # pyright: ignore[reportGeneralTypeIssues] +): image_url: Required[MessageUserMessageContentMulticontentPartArrayImageContentImageURL] type: Required[Literal["image_url"]] @@ -297,7 +313,11 @@ class MessageUserMessageContentMulticontentPartArrayAudioContentAudioContent(Typ """the base64 encoded audio data.""" -class MessageUserMessageContentMulticontentPartArrayAudioContent(TypedDict, total=False, extra_items=object): # type: ignore[call-arg] +class MessageUserMessageContentMulticontentPartArrayAudioContent( # type: ignore[call-arg] + TypedDict, + total=False, + extra_items=object, # pyright: ignore[reportGeneralTypeIssues] +): audio_content: Required[MessageUserMessageContentMulticontentPartArrayAudioContentAudioContent] type: Required[Literal["audio_content"]] @@ -309,7 +329,11 @@ class MessageUserMessageContentMulticontentPartArrayVideoContentVideoURL(TypedDi """Either a URL of the video or the base64 encoded video data.""" -class MessageUserMessageContentMulticontentPartArrayVideoContent(TypedDict, total=False, extra_items=object): # type: ignore[call-arg] +class MessageUserMessageContentMulticontentPartArrayVideoContent( # type: ignore[call-arg] + TypedDict, + total=False, + extra_items=object, # pyright: ignore[reportGeneralTypeIssues] +): type: Required[Literal["video_url"]] """type of content to send. in this case `video_url`.""" @@ -324,7 +348,11 @@ class MessageUserMessageContentMulticontentPartArrayVideoContent(TypedDict, tota ] -class MessageUserMessage(TypedDict, total=False, extra_items=object): # type: ignore[call-arg] +class MessageUserMessage( # type: ignore[call-arg] + TypedDict, + total=False, + extra_items=object, # pyright: ignore[reportGeneralTypeIssues] +): content: Required[Union[str, Iterable[MessageUserMessageContentMulticontentPartArray], None]] """The contents of the user message.""" @@ -332,7 +360,11 @@ class MessageUserMessage(TypedDict, total=False, extra_items=object): # type: i """The role of the messages author, in this case `user`.""" -class MessageAssistantMessageContentTextContentPartArray(TypedDict, total=False, extra_items=object): # type: ignore[call-arg] +class MessageAssistantMessageContentTextContentPartArray( # type: ignore[call-arg] + TypedDict, + total=False, + extra_items=object, # pyright: ignore[reportGeneralTypeIssues] +): text: Required[str] """string content of the message""" @@ -340,7 +372,11 @@ class MessageAssistantMessageContentTextContentPartArray(TypedDict, total=False, """type of content to send. in this case `text`.""" -class MessageAssistantMessageToolCallFunction(TypedDict, total=False, extra_items=object): # type: ignore[call-arg] +class MessageAssistantMessageToolCallFunction( # type: ignore[call-arg] + TypedDict, + total=False, + extra_items=object, # pyright: ignore[reportGeneralTypeIssues] +): """The tool that the model called.""" arguments: Optional[str] @@ -355,7 +391,11 @@ class MessageAssistantMessageToolCallFunction(TypedDict, total=False, extra_item """The name of the function to call.""" -class MessageAssistantMessageToolCall(TypedDict, total=False, extra_items=object): # type: ignore[call-arg] +class MessageAssistantMessageToolCall( # type: ignore[call-arg] + TypedDict, + total=False, + extra_items=object, # pyright: ignore[reportGeneralTypeIssues] +): function: Required[MessageAssistantMessageToolCallFunction] """The tool that the model called.""" @@ -369,7 +409,11 @@ class MessageAssistantMessageToolCall(TypedDict, total=False, extra_items=object """type of the tool cal. only `function` is supported.""" -class MessageAssistantMessage(TypedDict, total=False, extra_items=object): # type: ignore[call-arg] +class MessageAssistantMessage( # type: ignore[call-arg] + TypedDict, + total=False, + extra_items=object, # pyright: ignore[reportGeneralTypeIssues] +): content: Required[Union[str, Iterable[MessageAssistantMessageContentTextContentPartArray], None]] """The contents of the assistant message.""" @@ -386,7 +430,11 @@ class MessageAssistantMessage(TypedDict, total=False, extra_items=object): # ty """The tool calls generated by the model.""" -class MessageToolMessageContentTextContentPartArray(TypedDict, total=False, extra_items=object): # type: ignore[call-arg] +class MessageToolMessageContentTextContentPartArray( # type: ignore[call-arg] + TypedDict, + total=False, + extra_items=object, # pyright: ignore[reportGeneralTypeIssues] +): text: Required[str] """string content of the message""" @@ -394,7 +442,11 @@ class MessageToolMessageContentTextContentPartArray(TypedDict, total=False, extr """type of content to send. in this case `text`.""" -class MessageToolMessage(TypedDict, total=False, extra_items=object): # type: ignore[call-arg] +class MessageToolMessage( # type: ignore[call-arg] + TypedDict, + total=False, + extra_items=object, # pyright: ignore[reportGeneralTypeIssues] +): content: Required[Union[str, Iterable[MessageToolMessageContentTextContentPartArray]]] """The contents of the tool message.""" @@ -405,7 +457,11 @@ class MessageToolMessage(TypedDict, total=False, extra_items=object): # type: i Message: TypeAlias = Union[MessageSystemMessage, MessageUserMessage, MessageAssistantMessage, MessageToolMessage] -class ChatTemplateKwargs(TypedDict, total=False, extra_items=object): # type: ignore[call-arg] +class ChatTemplateKwargs( # type: ignore[call-arg] + TypedDict, + total=False, + extra_items=object, # pyright: ignore[reportGeneralTypeIssues] +): """A dictionary of additional keyword arguments to pass into the chat template. Use this to provide extra context or parameters that the model's chat template can process. Keys must be strings; values may be any valid JSON type. @@ -418,7 +474,11 @@ class ChatTemplateKwargs(TypedDict, total=False, extra_items=object): # type: i """ -class ResponseFormatResponseFormatJsonSchemaJsonSchema(TypedDict, total=False, extra_items=object): # type: ignore[call-arg] +class ResponseFormatResponseFormatJsonSchemaJsonSchema( # type: ignore[call-arg] + TypedDict, + total=False, + extra_items=object, # pyright: ignore[reportGeneralTypeIssues] +): """A JSON Schema definition the model's structured output. Follows standard JSON Schema syntax. @@ -437,7 +497,11 @@ class ResponseFormatResponseFormatJsonSchemaJsonSchema(TypedDict, total=False, e """whether or not to do an strict validation of the schema""" -class ResponseFormatResponseFormatJsonSchema(TypedDict, total=False, extra_items=object): # type: ignore[call-arg] +class ResponseFormatResponseFormatJsonSchema( # type: ignore[call-arg] + TypedDict, + total=False, + extra_items=object, # pyright: ignore[reportGeneralTypeIssues] +): """ Specifies that the model should produce output conforming to a given JSON schema. """ @@ -451,13 +515,21 @@ class ResponseFormatResponseFormatJsonSchema(TypedDict, total=False, extra_items type: Required[Literal["json_schema"]] -class ResponseFormatResponseFormatJsonObject(TypedDict, total=False, extra_items=object): # type: ignore[call-arg] +class ResponseFormatResponseFormatJsonObject( # type: ignore[call-arg] + TypedDict, + total=False, + extra_items=object, # pyright: ignore[reportGeneralTypeIssues] +): """Specifies that the model should produce output as a raw JSON object.""" type: Required[Literal["json_object"]] -class ResponseFormatResponseFormatText(TypedDict, total=False, extra_items=object): # type: ignore[call-arg] +class ResponseFormatResponseFormatText( # type: ignore[call-arg] + TypedDict, + total=False, + extra_items=object, # pyright: ignore[reportGeneralTypeIssues] +): """Specifies that the model should produce output as plain text. This value is not supported yet in the chat compeltions api, if this behavior is desired do not set response format. @@ -471,14 +543,22 @@ class ResponseFormatResponseFormatText(TypedDict, total=False, extra_items=objec ] -class StreamOptions(TypedDict, total=False, extra_items=object): # type: ignore[call-arg] +class StreamOptions( # type: ignore[call-arg] + TypedDict, + total=False, + extra_items=object, # pyright: ignore[reportGeneralTypeIssues] +): """Options for streaming response. Only set this when setting stream as true""" include_usage: Optional[bool] """Whether to include the usage metrics in a final chunk or not""" -class ToolChoiceToolChoiceObjectFunction(TypedDict, total=False, extra_items=object): # type: ignore[call-arg] +class ToolChoiceToolChoiceObjectFunction( # type: ignore[call-arg] + TypedDict, + total=False, + extra_items=object, # pyright: ignore[reportGeneralTypeIssues] +): """Specifies a tool the model should use. Use it to force the model to call that specific tool. @@ -488,7 +568,11 @@ class ToolChoiceToolChoiceObjectFunction(TypedDict, total=False, extra_items=obj """the name of the tool expected to be used by the model""" -class ToolChoiceToolChoiceObject(TypedDict, total=False, extra_items=object): # type: ignore[call-arg] +class ToolChoiceToolChoiceObject( # type: ignore[call-arg] + TypedDict, + total=False, + extra_items=object, # pyright: ignore[reportGeneralTypeIssues] +): function: Required[ToolChoiceToolChoiceObjectFunction] """Specifies a tool the model should use. @@ -502,7 +586,11 @@ class ToolChoiceToolChoiceObject(TypedDict, total=False, extra_items=object): # ToolChoice: TypeAlias = Union[Literal["none", "auto", "required"], ToolChoiceToolChoiceObject] -class ToolFunction(TypedDict, total=False, extra_items=object): # type: ignore[call-arg] +class ToolFunction( # type: ignore[call-arg] + TypedDict, + total=False, + extra_items=object, # pyright: ignore[reportGeneralTypeIssues] +): name: Required[str] """The name of the function to be called. @@ -525,7 +613,11 @@ class ToolFunction(TypedDict, total=False, extra_items=object): # type: ignore[ """ -class Tool(TypedDict, total=False, extra_items=object): # type: ignore[call-arg] +class Tool( # type: ignore[call-arg] + TypedDict, + total=False, + extra_items=object, # pyright: ignore[reportGeneralTypeIssues] +): function: Required[ToolFunction] type: Required[str] diff --git a/src/sambanova/types/completion_create_params.py b/src/sambanova/types/completion_create_params.py index 0ef1a58..1558179 100644 --- a/src/sambanova/types/completion_create_params.py +++ b/src/sambanova/types/completion_create_params.py @@ -176,7 +176,11 @@ class CompletionCreateParamsBase(TypedDict, total=False): """ -class StreamOptions(TypedDict, total=False, extra_items=object): # type: ignore[call-arg] +class StreamOptions( # type: ignore[call-arg] + TypedDict, + total=False, + extra_items=object, # pyright: ignore[reportGeneralTypeIssues] +): """Options for streaming response. Only set this when setting stream as true""" include_usage: Optional[bool] diff --git a/src/sambanova/types/message_create_params.py b/src/sambanova/types/message_create_params.py index c945e5f..70c0d8a 100644 --- a/src/sambanova/types/message_create_params.py +++ b/src/sambanova/types/message_create_params.py @@ -940,7 +940,11 @@ class Message(TypedDict, total=False): """ -class Metadata(TypedDict, total=False, extra_items=object): # type: ignore[call-arg] +class Metadata( # type: ignore[call-arg] + TypedDict, + total=False, + extra_items=object, # pyright: ignore[reportGeneralTypeIssues] +): """Free-form metadata attached to the request. Currently only `user_id` Additional fields are accepted but ignored. diff --git a/src/sambanova/types/response_create_params.py b/src/sambanova/types/response_create_params.py index 5f55006..cce58c0 100644 --- a/src/sambanova/types/response_create_params.py +++ b/src/sambanova/types/response_create_params.py @@ -237,7 +237,9 @@ class InputInputItemListResponseMessageContentContentPartArrayResponseTextConten class InputInputItemListResponseMessageContentContentPartArrayResponseTextContentLogprobTopLogprobs( # type: ignore[call-arg] - TypedDict, total=False, extra_items=object # pyright: ignore[reportGeneralTypeIssues] + TypedDict, + total=False, + extra_items=object, # pyright: ignore[reportGeneralTypeIssues] ): token: Required[str] @@ -247,7 +249,9 @@ class InputInputItemListResponseMessageContentContentPartArrayResponseTextConten class InputInputItemListResponseMessageContentContentPartArrayResponseTextContentLogprob( # type: ignore[call-arg] - TypedDict, total=False, extra_items=object # pyright: ignore[reportGeneralTypeIssues] + TypedDict, + total=False, + extra_items=object, # pyright: ignore[reportGeneralTypeIssues] ): token: Required[str]