Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
119 commits
Select commit Hold shift + click to select a range
fe77732
feat(api): api update
stainless-app[bot] Apr 21, 2026
9d6469a
codegen metadata
stainless-app[bot] Apr 21, 2026
74591dc
codegen metadata
stainless-app[bot] Apr 21, 2026
2f7edd6
codegen metadata
stainless-app[bot] Apr 21, 2026
bed2113
codegen metadata
stainless-app[bot] Apr 21, 2026
7cf4edf
codegen metadata
stainless-app[bot] Apr 22, 2026
47ac4b3
codegen metadata
stainless-app[bot] Apr 22, 2026
6ab23f1
codegen metadata
stainless-app[bot] Apr 22, 2026
86f9c35
codegen metadata
stainless-app[bot] Apr 22, 2026
32bfb06
codegen metadata
stainless-app[bot] Apr 22, 2026
f004301
chore(internal): more robust bootstrap script
stainless-app[bot] Apr 22, 2026
2c2720f
codegen metadata
stainless-app[bot] Apr 22, 2026
00478ab
codegen metadata
stainless-app[bot] Apr 22, 2026
91120c1
codegen metadata
stainless-app[bot] Apr 23, 2026
e94391b
codegen metadata
stainless-app[bot] Apr 23, 2026
b7a6d57
codegen metadata
stainless-app[bot] Apr 23, 2026
ded767c
codegen metadata
stainless-app[bot] Apr 23, 2026
5cd18b8
codegen metadata
stainless-app[bot] Apr 23, 2026
c6dba77
codegen metadata
stainless-app[bot] Apr 23, 2026
6228a58
codegen metadata
stainless-app[bot] Apr 23, 2026
2bd7a4f
codegen metadata
stainless-app[bot] Apr 23, 2026
5908a8b
codegen metadata
stainless-app[bot] Apr 23, 2026
750be6b
codegen metadata
stainless-app[bot] Apr 23, 2026
6205d50
codegen metadata
stainless-app[bot] Apr 23, 2026
d290e22
codegen metadata
stainless-app[bot] Apr 23, 2026
1c97f5e
codegen metadata
stainless-app[bot] Apr 24, 2026
84bf4b3
codegen metadata
stainless-app[bot] Apr 24, 2026
2779b33
codegen metadata
stainless-app[bot] Apr 24, 2026
c405423
codegen metadata
stainless-app[bot] Apr 24, 2026
330dd9f
codegen metadata
stainless-app[bot] Apr 24, 2026
b8092a1
codegen metadata
stainless-app[bot] Apr 24, 2026
d3ac6ca
codegen metadata
stainless-app[bot] Apr 24, 2026
af2633e
codegen metadata
stainless-app[bot] Apr 24, 2026
1b01ac9
codegen metadata
stainless-app[bot] Apr 24, 2026
9539911
codegen metadata
stainless-app[bot] Apr 25, 2026
bc13d58
codegen metadata
stainless-app[bot] Apr 25, 2026
fd1f1a7
codegen metadata
stainless-app[bot] Apr 25, 2026
712a9af
codegen metadata
stainless-app[bot] Apr 25, 2026
8b236c8
codegen metadata
stainless-app[bot] Apr 25, 2026
4d5cf4a
codegen metadata
stainless-app[bot] Apr 25, 2026
833fffc
codegen metadata
stainless-app[bot] Apr 25, 2026
24d3195
codegen metadata
stainless-app[bot] Apr 25, 2026
a753250
codegen metadata
stainless-app[bot] Apr 25, 2026
52a63d1
codegen metadata
stainless-app[bot] Apr 25, 2026
7f57293
codegen metadata
stainless-app[bot] Apr 25, 2026
8917dbb
codegen metadata
stainless-app[bot] Apr 25, 2026
760dba6
codegen metadata
stainless-app[bot] Apr 25, 2026
6d3d544
codegen metadata
stainless-app[bot] Apr 26, 2026
ece4721
codegen metadata
stainless-app[bot] Apr 26, 2026
97e0f40
codegen metadata
stainless-app[bot] Apr 26, 2026
36a3880
codegen metadata
stainless-app[bot] Apr 26, 2026
88227fc
codegen metadata
stainless-app[bot] Apr 26, 2026
fa98a83
codegen metadata
stainless-app[bot] Apr 26, 2026
f965a35
codegen metadata
stainless-app[bot] Apr 26, 2026
d11397e
codegen metadata
stainless-app[bot] Apr 26, 2026
d45aa28
codegen metadata
stainless-app[bot] Apr 26, 2026
da99502
codegen metadata
stainless-app[bot] Apr 27, 2026
f666c78
codegen metadata
stainless-app[bot] Apr 27, 2026
d4e1129
codegen metadata
stainless-app[bot] Apr 27, 2026
0ae5a52
codegen metadata
stainless-app[bot] Apr 27, 2026
f024829
codegen metadata
stainless-app[bot] Apr 27, 2026
9f23ec4
codegen metadata
stainless-app[bot] Apr 27, 2026
3c172ca
codegen metadata
stainless-app[bot] Apr 27, 2026
2f481b7
codegen metadata
stainless-app[bot] Apr 27, 2026
415f788
codegen metadata
stainless-app[bot] Apr 27, 2026
a2d5100
codegen metadata
stainless-app[bot] Apr 27, 2026
bd6d362
fix: use correct field name format for multipart file arrays
stainless-app[bot] Apr 27, 2026
8d175a2
codegen metadata
stainless-app[bot] Apr 27, 2026
74d0281
codegen metadata
stainless-app[bot] Apr 27, 2026
1f0d745
codegen metadata
stainless-app[bot] Apr 27, 2026
69e6656
codegen metadata
stainless-app[bot] Apr 27, 2026
a87fd7c
codegen metadata
stainless-app[bot] Apr 27, 2026
a73fd73
feat: support setting headers via env
stainless-app[bot] Apr 27, 2026
4185218
codegen metadata
stainless-app[bot] Apr 27, 2026
31eead1
codegen metadata
stainless-app[bot] Apr 28, 2026
7cc6e2b
codegen metadata
stainless-app[bot] Apr 28, 2026
752176c
codegen metadata
stainless-app[bot] Apr 28, 2026
9f3fa0e
codegen metadata
stainless-app[bot] Apr 28, 2026
d498765
codegen metadata
stainless-app[bot] Apr 28, 2026
9d2a0f6
codegen metadata
stainless-app[bot] Apr 28, 2026
18fc220
codegen metadata
stainless-app[bot] Apr 28, 2026
54a1873
codegen metadata
stainless-app[bot] Apr 28, 2026
60037f2
codegen metadata
stainless-app[bot] Apr 28, 2026
a051a9b
codegen metadata
stainless-app[bot] Apr 28, 2026
5689c1c
codegen metadata
stainless-app[bot] Apr 28, 2026
ee8121a
codegen metadata
stainless-app[bot] Apr 28, 2026
df70fd1
codegen metadata
stainless-app[bot] Apr 28, 2026
5ac12e5
codegen metadata
stainless-app[bot] Apr 28, 2026
fea215f
codegen metadata
stainless-app[bot] Apr 28, 2026
36d7cf7
codegen metadata
stainless-app[bot] Apr 29, 2026
a03d00d
codegen metadata
stainless-app[bot] Apr 29, 2026
1382863
codegen metadata
stainless-app[bot] Apr 29, 2026
314250c
codegen metadata
stainless-app[bot] Apr 29, 2026
c45c29c
codegen metadata
stainless-app[bot] Apr 29, 2026
a8fb88c
codegen metadata
stainless-app[bot] Apr 29, 2026
e670652
codegen metadata
stainless-app[bot] Apr 29, 2026
d467ec5
codegen metadata
stainless-app[bot] Apr 29, 2026
0249cba
codegen metadata
stainless-app[bot] Apr 29, 2026
af5e04f
codegen metadata
stainless-app[bot] Apr 29, 2026
9de5cd8
codegen metadata
stainless-app[bot] Apr 29, 2026
1907f4a
codegen metadata
stainless-app[bot] Apr 29, 2026
2ebe9e2
codegen metadata
stainless-app[bot] Apr 29, 2026
b7ebf0f
codegen metadata
stainless-app[bot] Apr 30, 2026
1e4cd0a
codegen metadata
stainless-app[bot] Apr 30, 2026
6a52279
codegen metadata
stainless-app[bot] Apr 30, 2026
072d8d4
codegen metadata
stainless-app[bot] Apr 30, 2026
1565486
codegen metadata
stainless-app[bot] Apr 30, 2026
7ae608d
codegen metadata
stainless-app[bot] Apr 30, 2026
ba7d7d6
codegen metadata
stainless-app[bot] Apr 30, 2026
def7fc0
codegen metadata
stainless-app[bot] Apr 30, 2026
ad3a4e0
codegen metadata
stainless-app[bot] Apr 30, 2026
9e8fb83
codegen metadata
stainless-app[bot] Apr 30, 2026
1962061
codegen metadata
stainless-app[bot] Apr 30, 2026
c980948
fix: allow litellm security patch (#336)
scale-ballen Apr 30, 2026
9d80e0b
fix(adk): Always inject headers on execute activity (#337)
declan-scale Apr 30, 2026
e6f11c4
perf(streaming): coalesce per-token publishes to Redis (50ms / 128-ch…
smoreinis Apr 30, 2026
fd2d1a7
codegen metadata
stainless-app[bot] Apr 30, 2026
16ab771
feat(api): api update
stainless-app[bot] Apr 30, 2026
79fc6e8
release: 0.10.3
stainless-app[bot] Apr 30, 2026
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
2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
".": "0.10.2"
".": "0.10.3"
}
4 changes: 2 additions & 2 deletions .stats.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
configured_endpoints: 45
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sgp%2Fagentex-sdk-eeb5bf63b18d948611eec48d0225e9bba63b170f64eeeb35d91825724b7cf6c3.yml
openapi_spec_hash: 5bbd18a405a11e8497d38a5a88b98018
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sgp/agentex-sdk-c108a179582f0e0c6d479ea4b3bc6310a83693987073967c2b6203df23718eb2.yml
openapi_spec_hash: 53b8e5866709af71bef94816b8ede38b
config_hash: fb079ef7936611b032568661b8165f19
28 changes: 28 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,33 @@
# Changelog

## 0.10.3 (2026-04-30)

Full Changelog: [v0.10.2...v0.10.3](https://github.com/scaleapi/scale-agentex-python/compare/v0.10.2...v0.10.3)

### Features

* **api:** api update ([16ab771](https://github.com/scaleapi/scale-agentex-python/commit/16ab771ab1396b94c768ec5185c2f8ed07eff556))
* **api:** api update ([fe77732](https://github.com/scaleapi/scale-agentex-python/commit/fe77732da48c872739bc6296d2932d4d9c810a35))
* support setting headers via env ([a73fd73](https://github.com/scaleapi/scale-agentex-python/commit/a73fd73ea036fc195c124636337acdc0552f18f1))


### Bug Fixes

* **adk:** Always inject headers on execute activity ([#337](https://github.com/scaleapi/scale-agentex-python/issues/337)) ([9d80e0b](https://github.com/scaleapi/scale-agentex-python/commit/9d80e0b797a9ed7a0838003294dc7a595ab18de5))
* allow litellm security patch ([#336](https://github.com/scaleapi/scale-agentex-python/issues/336)) ([c980948](https://github.com/scaleapi/scale-agentex-python/commit/c9809482d5e6095063115d1851f0b92a5e5a3755))
* **tests:** repair test_streaming_model so all 28 tests run and pass ([#334](https://github.com/scaleapi/scale-agentex-python/issues/334)) ([7e5e69c](https://github.com/scaleapi/scale-agentex-python/commit/7e5e69c132c89d054516e1a762e0437375859663))
* use correct field name format for multipart file arrays ([bd6d362](https://github.com/scaleapi/scale-agentex-python/commit/bd6d362aee81873b7969b0367488029e2bb0314b))


### Performance Improvements

* **streaming:** coalesce per-token publishes to Redis (50ms / 128-char window) ([#333](https://github.com/scaleapi/scale-agentex-python/issues/333)) ([e6f11c4](https://github.com/scaleapi/scale-agentex-python/commit/e6f11c45e6dc3186770088688ad45cc251387e4a))


### Chores

* **internal:** more robust bootstrap script ([f004301](https://github.com/scaleapi/scale-agentex-python/commit/f0043013a44ddcd9f356a8e0a548e4a295cb1b1d))

## 0.10.2 (2026-04-21)

Full Changelog: [v0.10.1...v0.10.2](https://github.com/scaleapi/scale-agentex-python/compare/v0.10.1...v0.10.2)
Expand Down
14 changes: 13 additions & 1 deletion examples/tutorials/run_agent_test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,18 @@ run_test() {


# Run the tests with retry mechanism
local -a pytest_cmd=("uv" "run" "pytest")
if [ "$BUILD_CLI" = true ]; then
local wheel_file
wheel_file=$(ls /home/runner/work/*/*/dist/agentex_sdk-*.whl 2>/dev/null | head -n1)
if [[ -z "$wheel_file" ]]; then
wheel_file=$(ls "${SCRIPT_DIR}/../../dist/agentex_sdk-*.whl" 2>/dev/null | head -n1)
fi
if [[ -n "$wheel_file" ]]; then
pytest_cmd=("uv" "run" "--with" "$wheel_file" "pytest")
fi
fi

local max_retries=5
local retry_count=0
local exit_code=1
Expand All @@ -270,7 +282,7 @@ run_test() {
fi

# Stream pytest output directly in real-time
uv run pytest tests/test_agent.py -v -s
"${pytest_cmd[@]}" tests/test_agent.py -v -s
exit_code=$?

if [ $exit_code -eq 0 ]; then
Expand Down
10 changes: 6 additions & 4 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "agentex-sdk"
version = "0.10.2"
version = "0.10.3"
description = "The official Python library for the agentex API"
dynamic = ["readme"]
license = "Apache-2.0"
Expand All @@ -9,7 +9,7 @@ authors = [
]

dependencies = [
"httpx>=0.27.2,<0.28",
"httpx>=0.28.1,<0.29",
"pydantic>=2.0.0, <3",
"typing-extensions>=4.14, <5",
"anyio>=3.5.0, <5",
Expand All @@ -18,7 +18,9 @@ dependencies = [
"typer>=0.16,<0.17",
"questionary>=2.0.1,<3",
"rich>=13.9.2,<14",
"fastapi>=0.115.0,<0.116",
"fastapi>=0.115.0",
"starlette>=0.49.1",
"tornado>=6.5.5",
"uvicorn>=0.31.1",
"watchfiles>=0.24.0,<1.0",
"python-on-whales>=0.73.0,<0.74",
Expand All @@ -28,7 +30,7 @@ dependencies = [
"temporalio>=1.26.0,<2",
"aiohttp>=3.10.10,<4",
"redis>=5.2.0,<6",
"litellm>=1.83.0,<2",
"litellm>=1.83.7,<2",
"kubernetes>=25.0.0,<36.0.0",
"jinja2>=3.1.3,<4",
"mcp[cli]>=1.4.1",
Expand Down
2 changes: 1 addition & 1 deletion scripts/bootstrap
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ set -e

cd "$(dirname "$0")/.."

if [ -f "Brewfile" ] && [ "$(uname -s)" = "Darwin" ] && [ "$SKIP_BREW" != "1" ] && [ -t 0 ]; then
if [ -f "Brewfile" ] && [ "$(uname -s)" = "Darwin" ] && [ "${SKIP_BREW:-}" != "1" ] && [ -t 0 ]; then
brew bundle check >/dev/null 2>&1 || {
echo -n "==> Install Homebrew dependencies? (y/N): "
read -r response
Expand Down
24 changes: 23 additions & 1 deletion src/agentex/_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,11 @@
RequestOptions,
not_given,
)
from ._utils import is_given, get_async_library
from ._utils import (
is_given,
is_mapping_t,
get_async_library,
)
from ._compat import cached_property
from ._version import __version__
from ._streaming import Stream as Stream, AsyncStream as AsyncStream
Expand Down Expand Up @@ -123,6 +127,15 @@ def __init__(
except KeyError as exc:
raise ValueError(f"Unknown environment: {environment}") from exc

custom_headers_env = os.environ.get("AGENTEX_CUSTOM_HEADERS")
if custom_headers_env is not None:
parsed: dict[str, str] = {}
for line in custom_headers_env.split("\n"):
colon = line.find(":")
if colon >= 0:
parsed[line[:colon].strip()] = line[colon + 1 :].strip()
default_headers = {**parsed, **(default_headers if is_mapping_t(default_headers) else {})}

super().__init__(
version=__version__,
base_url=base_url,
Expand Down Expand Up @@ -363,6 +376,15 @@ def __init__(
except KeyError as exc:
raise ValueError(f"Unknown environment: {environment}") from exc

custom_headers_env = os.environ.get("AGENTEX_CUSTOM_HEADERS")
if custom_headers_env is not None:
parsed: dict[str, str] = {}
for line in custom_headers_env.split("\n"):
colon = line.find(":")
if colon >= 0:
parsed[line[:colon].strip()] = line[colon + 1 :].strip()
default_headers = {**parsed, **(default_headers if is_mapping_t(default_headers) else {})}

super().__init__(
version=__version__,
base_url=base_url,
Expand Down
8 changes: 2 additions & 6 deletions src/agentex/_qs.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,13 @@

from typing import Any, List, Tuple, Union, Mapping, TypeVar
from urllib.parse import parse_qs, urlencode
from typing_extensions import Literal, get_args
from typing_extensions import get_args

from ._types import NotGiven, not_given
from ._types import NotGiven, ArrayFormat, NestedFormat, not_given
from ._utils import flatten

_T = TypeVar("_T")


ArrayFormat = Literal["comma", "repeat", "indices", "brackets"]
NestedFormat = Literal["dots", "brackets"]

PrimitiveData = Union[str, int, float, bool, None]
# this should be Data = Union[PrimitiveData, "List[Data]", "Tuple[Data]", "Mapping[str, Data]"]
# https://github.com/microsoft/pyright/issues/3555
Expand Down
3 changes: 3 additions & 0 deletions src/agentex/_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@
ModelT = TypeVar("ModelT", bound=pydantic.BaseModel)
_T = TypeVar("_T")

ArrayFormat = Literal["comma", "repeat", "indices", "brackets"]
NestedFormat = Literal["dots", "brackets"]


# Approximates httpx internal ProxiesTypes and RequestFiles types
# while adding support for `PathLike` instances
Expand Down
42 changes: 34 additions & 8 deletions src/agentex/_utils/_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@
)
from pathlib import Path
from datetime import date, datetime
from typing_extensions import TypeGuard
from typing_extensions import TypeGuard, get_args

import sniffio

from .._types import Omit, NotGiven, FileTypes, HeadersLike
from .._types import Omit, NotGiven, FileTypes, ArrayFormat, HeadersLike

_T = TypeVar("_T")
_TupleT = TypeVar("_TupleT", bound=Tuple[object, ...])
Expand All @@ -40,25 +40,45 @@ def extract_files(
query: Mapping[str, object],
*,
paths: Sequence[Sequence[str]],
array_format: ArrayFormat = "brackets",
) -> list[tuple[str, FileTypes]]:
"""Recursively extract files from the given dictionary based on specified paths.

A path may look like this ['foo', 'files', '<array>', 'data'].

``array_format`` controls how ``<array>`` segments contribute to the emitted
field name. Supported values: ``"brackets"`` (``foo[]``), ``"repeat"`` and
``"comma"`` (``foo``), ``"indices"`` (``foo[0]``, ``foo[1]``).

Note: this mutates the given dictionary.
"""
files: list[tuple[str, FileTypes]] = []
for path in paths:
files.extend(_extract_items(query, path, index=0, flattened_key=None))
files.extend(_extract_items(query, path, index=0, flattened_key=None, array_format=array_format))
return files


def _array_suffix(array_format: ArrayFormat, array_index: int) -> str:
if array_format == "brackets":
return "[]"
if array_format == "indices":
return f"[{array_index}]"
if array_format == "repeat" or array_format == "comma":
# Both repeat the bare field name for each file part; there is no
# meaningful way to comma-join binary parts.
return ""
raise NotImplementedError(
f"Unknown array_format value: {array_format}, choose from {', '.join(get_args(ArrayFormat))}"
)


def _extract_items(
obj: object,
path: Sequence[str],
*,
index: int,
flattened_key: str | None,
array_format: ArrayFormat,
) -> list[tuple[str, FileTypes]]:
try:
key = path[index]
Expand All @@ -75,9 +95,11 @@ def _extract_items(

if is_list(obj):
files: list[tuple[str, FileTypes]] = []
for entry in obj:
assert_is_file_content(entry, key=flattened_key + "[]" if flattened_key else "")
files.append((flattened_key + "[]", cast(FileTypes, entry)))
for array_index, entry in enumerate(obj):
suffix = _array_suffix(array_format, array_index)
emitted_key = (flattened_key + suffix) if flattened_key else suffix
assert_is_file_content(entry, key=emitted_key)
files.append((emitted_key, cast(FileTypes, entry)))
return files

assert_is_file_content(obj, key=flattened_key)
Expand Down Expand Up @@ -106,6 +128,7 @@ def _extract_items(
path,
index=index,
flattened_key=flattened_key,
array_format=array_format,
)
elif is_list(obj):
if key != "<array>":
Expand All @@ -117,9 +140,12 @@ def _extract_items(
item,
path,
index=index,
flattened_key=flattened_key + "[]" if flattened_key is not None else "[]",
flattened_key=(
(flattened_key if flattened_key is not None else "") + _array_suffix(array_format, array_index)
),
array_format=array_format,
)
for item in obj
for array_index, item in enumerate(obj)
]
)

Expand Down
2 changes: 1 addition & 1 deletion src/agentex/_version.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.

__title__ = "agentex"
__version__ = "0.10.2" # x-release-please-version
__version__ = "0.10.3" # x-release-please-version
9 changes: 8 additions & 1 deletion src/agentex/lib/adk/_modules/streaming.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from agentex.lib.adk.utils._modules.client import create_async_agentex_client
from agentex.lib.core.adapters.streams.adapter_redis import RedisStreamRepository
from agentex.lib.core.services.adk.streaming import (
StreamingMode,
StreamingService,
StreamingTaskMessageContext,
)
Expand Down Expand Up @@ -50,6 +51,7 @@ def streaming_task_message_context(
self,
task_id: str,
initial_content: TaskMessageContent,
streaming_mode: StreamingMode = "coalesced",
) -> StreamingTaskMessageContext:
"""
Create a streaming context for managing TaskMessage lifecycle.
Expand All @@ -60,7 +62,11 @@ def streaming_task_message_context(
Args:
task_id: The ID of the task
initial_content: The initial content for the TaskMessage
agentex_client: The agentex client for creating/updating messages
streaming_mode: How per-delta updates are published. Defaults to
"coalesced" (50ms / 128-char windowed batches with an immediate
first-delta flush). Pass "per_token" for the legacy publish-every-
delta behavior, or "off" to suppress per-delta publishes entirely
while still recording the full message body on close.

Returns:
StreamingTaskMessageContext: Context manager for streaming operations
Expand All @@ -76,4 +82,5 @@ def streaming_task_message_context(
return self._streaming_service.streaming_task_message_context(
task_id=task_id,
initial_content=initial_content,
streaming_mode=streaming_mode,
)
Loading
Loading