Skip to content

release: 1.7.0 #148

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 23 commits into from
Jul 23, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
d6a30cc
docs(client): fix httpx.Timeout documentation reference
stainless-app[bot] Jun 19, 2025
5066882
feat(client): add support for aiohttp
stainless-app[bot] Jun 21, 2025
0f7a7e0
chore(tests): skip some failing tests on the latest python versions
stainless-app[bot] Jun 24, 2025
03cfe8a
fix(ci): release-doctor — report correct token name
stainless-app[bot] Jun 27, 2025
e8bb659
codegen metadata
stainless-app[bot] Jun 27, 2025
f741da1
chore(ci): only run for pushes and fork pull requests
stainless-app[bot] Jun 28, 2025
79d08e8
fix(ci): correct conditional
stainless-app[bot] Jun 30, 2025
6e96a87
chore(ci): change upload type
stainless-app[bot] Jul 2, 2025
9fc71d7
feat(api): api update
stainless-app[bot] Jul 6, 2025
a3c10fb
feat(api): api update
stainless-app[bot] Jul 7, 2025
d63ac0c
chore(internal): bump pinned h11 dep
stainless-app[bot] Jul 9, 2025
7bfb29b
chore(package): mark python 3.13 as supported
stainless-app[bot] Jul 9, 2025
7291d4f
fix(parsing): correctly handle nested discriminated unions
stainless-app[bot] Jul 10, 2025
b539afe
codegen metadata
stainless-app[bot] Jul 11, 2025
c3d919a
chore(readme): fix version rendering on pypi
stainless-app[bot] Jul 11, 2025
6a3e11c
fix(client): don't send Content-Type header on GET requests
stainless-app[bot] Jul 12, 2025
47ab416
feat: clean up environment call outs
stainless-app[bot] Jul 15, 2025
471c9b5
codegen metadata
stainless-app[bot] Jul 15, 2025
ef473c5
feat(api): api update
stainless-app[bot] Jul 17, 2025
ad08b68
feat(api): api update
stainless-app[bot] Jul 17, 2025
52e08bc
fix(parsing): ignore empty metadata
stainless-app[bot] Jul 22, 2025
034b5dc
fix(parsing): parse extra field types
stainless-app[bot] Jul 23, 2025
99e2bbc
release: 1.7.0
stainless-app[bot] Jul 23, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 19 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ jobs:
timeout-minutes: 10
name: lint
runs-on: ${{ github.repository == 'stainless-sdks/arcade-engine-python' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
if: github.event_name == 'push' || github.event.pull_request.head.repo.fork
steps:
- uses: actions/checkout@v4

Expand All @@ -34,17 +35,31 @@ jobs:
- name: Run lints
run: ./scripts/lint

upload:
if: github.repository == 'stainless-sdks/arcade-engine-python'
build:
if: github.repository == 'stainless-sdks/arcade-engine-python' && (github.event_name == 'push' || github.event.pull_request.head.repo.fork)
timeout-minutes: 10
name: upload
name: build
permissions:
contents: read
id-token: write
runs-on: depot-ubuntu-24.04
steps:
- uses: actions/checkout@v4

- name: Install Rye
run: |
curl -sSf https://rye.astral.sh/get | bash
echo "$HOME/.rye/shims" >> $GITHUB_PATH
env:
RYE_VERSION: '0.44.0'
RYE_INSTALL_OPTION: '--yes'

- name: Install dependencies
run: rye sync --all-features

- name: Run build
run: rye build

- name: Get GitHub OIDC Token
id: github-oidc
uses: actions/github-script@v6
Expand All @@ -62,6 +77,7 @@ jobs:
timeout-minutes: 10
name: test
runs-on: ${{ github.repository == 'stainless-sdks/arcade-engine-python' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
if: github.event_name == 'push' || github.event.pull_request.head.repo.fork
steps:
- uses: actions/checkout@v4

Expand Down
2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
".": "1.6.0"
".": "1.7.0"
}
8 changes: 4 additions & 4 deletions .stats.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
configured_endpoints: 28
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/arcade-ai%2Farcade-engine-51958c25f4f5f8d03d873744f15369a2ce2894f246f162aecac70d1b4d2b6008.yml
openapi_spec_hash: 5f61d1691a2c83c8067bc837b0000237
config_hash: 6eb072febff9e7aba9cdeb6901761b97
configured_endpoints: 29
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/arcade-ai%2Farcade-engine-b75dffb978bef36324c145a749091760738e0279993d012612135ca0cbee18f5.yml
openapi_spec_hash: b4beb7b5837d4f8074832f0f42bff1b4
config_hash: 3ff9aba9377f3c19253a0f87243f40d9
38 changes: 38 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,43 @@
# Changelog

## 1.7.0 (2025-07-23)

Full Changelog: [v1.6.0...v1.7.0](https://github.com/ArcadeAI/arcade-py/compare/v1.6.0...v1.7.0)

### Features

* **api:** api update ([ad08b68](https://github.com/ArcadeAI/arcade-py/commit/ad08b68a90d83b6488f7214469757354131828a3))
* **api:** api update ([ef473c5](https://github.com/ArcadeAI/arcade-py/commit/ef473c51ed732f25f731ae9e29ae5a62cf9e5928))
* **api:** api update ([a3c10fb](https://github.com/ArcadeAI/arcade-py/commit/a3c10fb94599d7e0adc0420027d35f578b5f05e0))
* **api:** api update ([9fc71d7](https://github.com/ArcadeAI/arcade-py/commit/9fc71d78c6bbf539e1de774373ed4b0fbe0c28ea))
* clean up environment call outs ([47ab416](https://github.com/ArcadeAI/arcade-py/commit/47ab416eaa76e665c7ec9d3a67b239eccc67e5e8))
* **client:** add support for aiohttp ([5066882](https://github.com/ArcadeAI/arcade-py/commit/50668821ffc127000372f06286f8eb74c02a7ab4))


### Bug Fixes

* **ci:** correct conditional ([79d08e8](https://github.com/ArcadeAI/arcade-py/commit/79d08e82eb314f465c3cd4052af53c906e4cbfd6))
* **ci:** release-doctor — report correct token name ([03cfe8a](https://github.com/ArcadeAI/arcade-py/commit/03cfe8aed6485613f5228053d313f8152f6262a3))
* **client:** don't send Content-Type header on GET requests ([6a3e11c](https://github.com/ArcadeAI/arcade-py/commit/6a3e11c209c831ae351feccda0d0f19970f1f7de))
* **parsing:** correctly handle nested discriminated unions ([7291d4f](https://github.com/ArcadeAI/arcade-py/commit/7291d4f6005e1c4ec9732ec56085031ce4b6a822))
* **parsing:** ignore empty metadata ([52e08bc](https://github.com/ArcadeAI/arcade-py/commit/52e08bcfd9aa364dbe1708799846a92ed2b3707d))
* **parsing:** parse extra field types ([034b5dc](https://github.com/ArcadeAI/arcade-py/commit/034b5dc3b14a34c445a75bfda65615b3eec6f936))


### Chores

* **ci:** change upload type ([6e96a87](https://github.com/ArcadeAI/arcade-py/commit/6e96a8738a5d6d7b4e805be9c0cbc430b6dacf90))
* **ci:** only run for pushes and fork pull requests ([f741da1](https://github.com/ArcadeAI/arcade-py/commit/f741da11f0a604bc7cf5e434578adca7a8f5e7a1))
* **internal:** bump pinned h11 dep ([d63ac0c](https://github.com/ArcadeAI/arcade-py/commit/d63ac0c1b7cfa29d44d6f69c94d28a8099f715bb))
* **package:** mark python 3.13 as supported ([7bfb29b](https://github.com/ArcadeAI/arcade-py/commit/7bfb29be939adebe113d045b2b2baa53ac1be36f))
* **readme:** fix version rendering on pypi ([c3d919a](https://github.com/ArcadeAI/arcade-py/commit/c3d919ae31ff06e4dd3f5f792dcf137c5133452d))
* **tests:** skip some failing tests on the latest python versions ([0f7a7e0](https://github.com/ArcadeAI/arcade-py/commit/0f7a7e0150f819d24f6295f98bc7102b74a4892c))


### Documentation

* **client:** fix httpx.Timeout documentation reference ([d6a30cc](https://github.com/ArcadeAI/arcade-py/commit/d6a30cc3d80d0521cc4456d016e7a726ad1247e1))

## 1.6.0 (2025-06-18)

Full Changelog: [v1.5.0...v1.6.0](https://github.com/ArcadeAI/arcade-py/compare/v1.5.0...v1.6.0)
Expand Down
40 changes: 38 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# Arcade Python API library

[![PyPI version](<https://img.shields.io/pypi/v/arcadepy.svg?label=pypi%20(stable)>)](https://pypi.org/project/arcadepy/)
<!-- prettier-ignore -->
[![PyPI version](https://img.shields.io/pypi/v/arcadepy.svg?label=pypi%20(stable))](https://pypi.org/project/arcadepy/)

The Arcade Python library provides convenient access to the Arcade REST API from any Python 3.8+
application. The library includes type definitions for all request params and response fields,
Expand Down Expand Up @@ -72,6 +73,41 @@ asyncio.run(main())

Functionality between the synchronous and asynchronous clients is otherwise identical.

### With aiohttp

By default, the async client uses `httpx` for HTTP requests. However, for improved concurrency performance you may also use `aiohttp` as the HTTP backend.

You can enable this by installing `aiohttp`:

```sh
# install from PyPI
pip install arcadepy[aiohttp]
```

Then you can enable it by instantiating the client with `http_client=DefaultAioHttpClient()`:

```python
import asyncio
from arcadepy import DefaultAioHttpClient
from arcadepy import AsyncArcade


async def main() -> None:
async with AsyncArcade(
api_key="My API Key",
http_client=DefaultAioHttpClient(),
) as client:
execute_tool_response = await client.tools.execute(
tool_name="Google.ListEmails",
input={"n_emails": 10},
user_id="[email protected]",
)
print(execute_tool_response.id)


asyncio.run(main())
```

## Using types

Nested request parameters are [TypedDicts](https://docs.python.org/3/library/typing.html#typing.TypedDict). Responses are [Pydantic models](https://docs.pydantic.dev) which also provide helper methods for things like:
Expand Down Expand Up @@ -175,7 +211,7 @@ client.with_options(max_retries=5).chat.completions.create(
### Timeouts

By default requests time out after 1 minute. You can configure this with a `timeout` option,
which accepts a float or an [`httpx.Timeout`](https://www.python-httpx.org/advanced/#fine-tuning-the-configuration) object:
which accepts a float or an [`httpx.Timeout`](https://www.python-httpx.org/advanced/timeouts/#fine-tuning-the-configuration) object:

```python
from arcadepy import Arcade
Expand Down
3 changes: 2 additions & 1 deletion api.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,12 +58,13 @@ Methods:
Types:

```python
from arcadepy.types import AuthRequest
from arcadepy.types import AuthRequest, ConfirmUserRequest, ConfirmUserResponse
```

Methods:

- <code title="post /v1/auth/authorize">client.auth.<a href="./src/arcadepy/resources/auth.py">authorize</a>(\*\*<a href="src/arcadepy/types/auth_authorize_params.py">params</a>) -> <a href="./src/arcadepy/types/shared/auth_authorization_response.py">AuthorizationResponse</a></code>
- <code title="post /v1/auth/confirm_user">client.auth.<a href="./src/arcadepy/resources/auth.py">confirm_user</a>(\*\*<a href="src/arcadepy/types/auth_confirm_user_params.py">params</a>) -> <a href="./src/arcadepy/types/confirm_user_response.py">ConfirmUserResponse</a></code>
- <code title="get /v1/auth/status">client.auth.<a href="./src/arcadepy/resources/auth.py">status</a>(\*\*<a href="src/arcadepy/types/auth_status_params.py">params</a>) -> <a href="./src/arcadepy/types/shared/auth_authorization_response.py">AuthorizationResponse</a></code>

# Health
Expand Down
2 changes: 1 addition & 1 deletion bin/check-release-environment
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
errors=()

if [ -z "${PYPI_TOKEN}" ]; then
errors+=("The ARCADE_PYPI_TOKEN secret has not been set. Please set it in either this repository's secrets or your organization secrets.")
errors+=("The PYPI_TOKEN secret has not been set. Please set it in either this repository's secrets or your organization secrets.")
fi

lenErrors=${#errors[@]}
Expand Down
5 changes: 4 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "arcadepy"
version = "1.6.0"
version = "1.7.0"
description = "The official Python library for the Arcade API"
dynamic = ["readme"]
license = "MIT"
Expand All @@ -24,6 +24,7 @@ classifiers = [
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Operating System :: OS Independent",
"Operating System :: POSIX",
"Operating System :: MacOS",
Expand All @@ -37,6 +38,8 @@ classifiers = [
Homepage = "https://github.com/ArcadeAI/arcade-py"
Repository = "https://github.com/ArcadeAI/arcade-py"

[project.optional-dependencies]
aiohttp = ["aiohttp", "httpx_aiohttp>=0.1.8"]

[tool.rye]
managed = true
Expand Down
31 changes: 29 additions & 2 deletions requirements-dev.lock
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,24 @@
# universal: false

-e file:.
aiohappyeyeballs==2.6.1
# via aiohttp
aiohttp==3.12.8
# via arcadepy
# via httpx-aiohttp
aiosignal==1.3.2
# via aiohttp
annotated-types==0.6.0
# via pydantic
anyio==4.4.0
# via arcadepy
# via httpx
argcomplete==3.1.2
# via nox
async-timeout==5.0.1
# via aiohttp
attrs==25.3.0
# via aiohttp
certifi==2023.7.22
# via httpcore
# via httpx
Expand All @@ -34,23 +45,33 @@ execnet==2.1.1
# via pytest-xdist
filelock==3.12.4
# via virtualenv
h11==0.14.0
frozenlist==1.6.2
# via aiohttp
# via aiosignal
h11==0.16.0
# via httpcore
httpcore==1.0.2
httpcore==1.0.9
# via httpx
httpx==0.28.1
# via arcadepy
# via httpx-aiohttp
# via respx
httpx-aiohttp==0.1.8
# via arcadepy
idna==3.4
# via anyio
# via httpx
# via yarl
importlib-metadata==7.0.0
iniconfig==2.0.0
# via pytest
markdown-it-py==3.0.0
# via rich
mdurl==0.1.2
# via markdown-it-py
multidict==6.4.4
# via aiohttp
# via yarl
mypy==1.14.1
mypy-extensions==1.0.0
# via mypy
Expand All @@ -65,6 +86,9 @@ platformdirs==3.11.0
# via virtualenv
pluggy==1.5.0
# via pytest
propcache==0.3.1
# via aiohttp
# via yarl
pydantic==2.10.3
# via arcadepy
pydantic-core==2.27.1
Expand Down Expand Up @@ -98,11 +122,14 @@ tomli==2.0.2
typing-extensions==4.12.2
# via anyio
# via arcadepy
# via multidict
# via mypy
# via pydantic
# via pydantic-core
# via pyright
virtualenv==20.24.5
# via nox
yarl==1.20.0
# via aiohttp
zipp==3.17.0
# via importlib-metadata
31 changes: 29 additions & 2 deletions requirements.lock
Original file line number Diff line number Diff line change
Expand Up @@ -10,27 +10,51 @@
# universal: false

-e file:.
aiohappyeyeballs==2.6.1
# via aiohttp
aiohttp==3.12.8
# via arcadepy
# via httpx-aiohttp
aiosignal==1.3.2
# via aiohttp
annotated-types==0.6.0
# via pydantic
anyio==4.4.0
# via arcadepy
# via httpx
async-timeout==5.0.1
# via aiohttp
attrs==25.3.0
# via aiohttp
certifi==2023.7.22
# via httpcore
# via httpx
distro==1.8.0
# via arcadepy
exceptiongroup==1.2.2
# via anyio
h11==0.14.0
frozenlist==1.6.2
# via aiohttp
# via aiosignal
h11==0.16.0
# via httpcore
httpcore==1.0.2
httpcore==1.0.9
# via httpx
httpx==0.28.1
# via arcadepy
# via httpx-aiohttp
httpx-aiohttp==0.1.8
# via arcadepy
idna==3.4
# via anyio
# via httpx
# via yarl
multidict==6.4.4
# via aiohttp
# via yarl
propcache==0.3.1
# via aiohttp
# via yarl
pydantic==2.10.3
# via arcadepy
pydantic-core==2.27.1
Expand All @@ -41,5 +65,8 @@ sniffio==1.3.0
typing-extensions==4.12.2
# via anyio
# via arcadepy
# via multidict
# via pydantic
# via pydantic-core
yarl==1.20.0
# via aiohttp
12 changes: 7 additions & 5 deletions scripts/utils/upload-artifact.sh
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
#!/usr/bin/env bash
set -exuo pipefail

RESPONSE=$(curl -X POST "$URL" \
FILENAME=$(basename dist/*.whl)

RESPONSE=$(curl -X POST "$URL?filename=$FILENAME" \
-H "Authorization: Bearer $AUTH" \
-H "Content-Type: application/json")

Expand All @@ -12,13 +14,13 @@ if [[ "$SIGNED_URL" == "null" ]]; then
exit 1
fi

UPLOAD_RESPONSE=$(tar -cz . | curl -v -X PUT \
-H "Content-Type: application/gzip" \
--data-binary @- "$SIGNED_URL" 2>&1)
UPLOAD_RESPONSE=$(curl -v -X PUT \
-H "Content-Type: binary/octet-stream" \
--data-binary "@dist/$FILENAME" "$SIGNED_URL" 2>&1)

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/arcade-engine-python/$SHA'\033[0m"
echo -e "\033[32mInstallation: pip install 'https://pkg.stainless.com/s/arcade-engine-python/$SHA/$FILENAME'\033[0m"
else
echo -e "\033[31mFailed to upload artifact.\033[0m"
exit 1
Expand Down
Loading