From 49b32b4095ad06abda2ef43fc04edd3ba9620c52 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 9 Sep 2025 15:15:17 +0000 Subject: [PATCH 1/8] chore(internal): move mypy configurations to `pyproject.toml` file --- mypy.ini | 50 ------------------------------------------------ pyproject.toml | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 50 deletions(-) delete mode 100644 mypy.ini diff --git a/mypy.ini b/mypy.ini deleted file mode 100644 index 7d5e61da..00000000 --- a/mypy.ini +++ /dev/null @@ -1,50 +0,0 @@ -[mypy] -pretty = True -show_error_codes = True - -# Exclude _files.py because mypy isn't smart enough to apply -# the correct type narrowing and as this is an internal module -# it's fine to just use Pyright. -# -# We also exclude our `tests` as mypy doesn't always infer -# types correctly and Pyright will still catch any type errors. -exclude = ^(src/openlayer/_files\.py|_dev/.*\.py|src/openlayer/lib/.*\.py|examples/.*\.py|tests/.*)$ - -strict_equality = True -implicit_reexport = True -check_untyped_defs = True -no_implicit_optional = True - -warn_return_any = True -warn_unreachable = True -warn_unused_configs = True - -# Turn these options off as it could cause conflicts -# with the Pyright options. -warn_unused_ignores = False -warn_redundant_casts = False - -disallow_any_generics = True -disallow_untyped_defs = True -disallow_untyped_calls = True -disallow_subclassing_any = True -disallow_incomplete_defs = True -disallow_untyped_decorators = True -cache_fine_grained = True - -# By default, mypy reports an error if you assign a value to the result -# of a function call that doesn't return anything. We do this in our test -# cases: -# ``` -# result = ... -# assert result is None -# ``` -# Changing this codegen to make mypy happy would increase complexity -# and would not be worth it. -disable_error_code = func-returns-value,overload-cannot-match - -# https://github.com/python/mypy/issues/12162 -[mypy.overrides] -module = "black.files.*" -ignore_errors = true -ignore_missing_imports = true diff --git a/pyproject.toml b/pyproject.toml index 3e8206ba..487008aa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -165,6 +165,58 @@ reportOverlappingOverload = false reportImportCycles = false reportPrivateUsage = false +[tool.mypy] +pretty = true +show_error_codes = true + +# Exclude _files.py because mypy isn't smart enough to apply +# the correct type narrowing and as this is an internal module +# it's fine to just use Pyright. +# +# We also exclude our `tests` as mypy doesn't always infer +# types correctly and Pyright will still catch any type errors. +exclude = ['src/openlayer/_files.py', '_dev/.*.py', 'tests/.*'] + +strict_equality = true +implicit_reexport = true +check_untyped_defs = true +no_implicit_optional = true + +warn_return_any = true +warn_unreachable = true +warn_unused_configs = true + +# Turn these options off as it could cause conflicts +# with the Pyright options. +warn_unused_ignores = false +warn_redundant_casts = false + +disallow_any_generics = true +disallow_untyped_defs = true +disallow_untyped_calls = true +disallow_subclassing_any = true +disallow_incomplete_defs = true +disallow_untyped_decorators = true +cache_fine_grained = true + +# By default, mypy reports an error if you assign a value to the result +# of a function call that doesn't return anything. We do this in our test +# cases: +# ``` +# result = ... +# assert result is None +# ``` +# Changing this codegen to make mypy happy would increase complexity +# and would not be worth it. +disable_error_code = "func-returns-value,overload-cannot-match" + +# https://github.com/python/mypy/issues/12162 +[[tool.mypy.overrides]] +module = "black.files.*" +ignore_errors = true +ignore_missing_imports = true + + [tool.ruff] line-length = 120 output-format = "grouped" From d30a16505f86135c3f5980307a9ae073de1a4708 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sat, 6 Sep 2025 03:33:22 +0000 Subject: [PATCH 2/8] chore(tests): simplify `get_platform` test `nest_asyncio` is archived and broken on some platforms so it's not worth keeping in our test suite. --- pyproject.toml | 1 - requirements-dev.lock | 1 - tests/test_client.py | 53 +++++-------------------------------------- 3 files changed, 6 insertions(+), 49 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 487008aa..1e633618 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -62,7 +62,6 @@ dev-dependencies = [ "dirty-equals>=0.6.0", "importlib-metadata>=6.7.0", "rich>=13.7.1", - "nest_asyncio==1.6.0", "pytest-xdist>=3.6.1", ] diff --git a/requirements-dev.lock b/requirements-dev.lock index 8cddda44..157f47cb 100644 --- a/requirements-dev.lock +++ b/requirements-dev.lock @@ -77,7 +77,6 @@ multidict==6.5.0 mypy==1.14.1 mypy-extensions==1.0.0 # via mypy -nest-asyncio==1.6.0 nodeenv==1.8.0 # via pyright nox==2023.4.22 diff --git a/tests/test_client.py b/tests/test_client.py index 00de783e..2cb1bfd6 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -6,13 +6,10 @@ import os import sys import json -import time import asyncio import inspect -import subprocess import tracemalloc from typing import Any, Union, cast -from textwrap import dedent from unittest import mock from typing_extensions import Literal @@ -23,14 +20,17 @@ from openlayer import Openlayer, AsyncOpenlayer, APIResponseValidationError from openlayer._types import Omit +from openlayer._utils import asyncify from openlayer._models import BaseModel, FinalRequestOptions from openlayer._exceptions import APIStatusError, APITimeoutError, APIResponseValidationError from openlayer._base_client import ( DEFAULT_TIMEOUT, HTTPX_DEFAULT_TIMEOUT, BaseClient, + OtherPlatform, DefaultHttpxClient, DefaultAsyncHttpxClient, + get_platform, make_request_options, ) @@ -1791,50 +1791,9 @@ def retry_handler(_request: httpx.Request) -> httpx.Response: assert response.http_request.headers.get("x-stainless-retry-count") == "42" - def test_get_platform(self) -> None: - # A previous implementation of asyncify could leave threads unterminated when - # used with nest_asyncio. - # - # Since nest_asyncio.apply() is global and cannot be un-applied, this - # test is run in a separate process to avoid affecting other tests. - test_code = dedent(""" - import asyncio - import nest_asyncio - import threading - - from openlayer._utils import asyncify - from openlayer._base_client import get_platform - - async def test_main() -> None: - result = await asyncify(get_platform)() - print(result) - for thread in threading.enumerate(): - print(thread.name) - - nest_asyncio.apply() - asyncio.run(test_main()) - """) - with subprocess.Popen( - [sys.executable, "-c", test_code], - text=True, - ) as process: - timeout = 10 # seconds - - start_time = time.monotonic() - while True: - return_code = process.poll() - if return_code is not None: - if return_code != 0: - raise AssertionError("calling get_platform using asyncify resulted in a non-zero exit code") - - # success - break - - if time.monotonic() - start_time > timeout: - process.kill() - raise AssertionError("calling get_platform using asyncify resulted in a hung process") - - time.sleep(0.1) + async def test_get_platform(self) -> None: + platform = await asyncify(get_platform)() + assert isinstance(platform, (str, OtherPlatform)) async def test_proxy_environment_variables(self, monkeypatch: pytest.MonkeyPatch) -> None: # Test that the proxy environment variables are set correctly From 59e1a983a9b7e9975a34520e26055e7ef6b236cb Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 9 Sep 2025 15:18:02 +0000 Subject: [PATCH 3/8] chore(internal): version bump From e65c84e5420874636c405ddd5cce8dd2f4e69bbf Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 9 Sep 2025 11:50:45 +0000 Subject: [PATCH 4/8] feat(api): api update --- .stats.yml | 2 +- .../types/inference_pipelines/data_stream_params.py | 6 ++++++ tests/api_resources/inference_pipelines/test_data.py | 4 ++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.stats.yml b/.stats.yml index 2b09528b..0b70a4d7 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,3 +1,3 @@ configured_endpoints: 18 -openapi_spec_hash: 20f058101a252f7500803d66aff58eb3 +openapi_spec_hash: 153617b7252b1b12f21043b2a1246f8b config_hash: 30422a4611d93ca69e4f1aff60b9ddb5 diff --git a/src/openlayer/types/inference_pipelines/data_stream_params.py b/src/openlayer/types/inference_pipelines/data_stream_params.py index a897b34a..fd3a0cac 100644 --- a/src/openlayer/types/inference_pipelines/data_stream_params.py +++ b/src/openlayer/types/inference_pipelines/data_stream_params.py @@ -82,6 +82,9 @@ class ConfigLlmData(TypedDict, total=False): Applies to RAG use cases. Providing the question enables RAG-specific metrics. """ + session_id_column_name: Annotated[Optional[str], PropertyInfo(alias="sessionIdColumnName")] + """Name of the column with the session id.""" + timestamp_column_name: Annotated[str, PropertyInfo(alias="timestampColumnName")] """Name of the column with the timestamps. @@ -89,6 +92,9 @@ class ConfigLlmData(TypedDict, total=False): used. """ + user_id_column_name: Annotated[Optional[str], PropertyInfo(alias="userIdColumnName")] + """Name of the column with the user id.""" + class ConfigTabularClassificationData(TypedDict, total=False): class_names: Required[Annotated[SequenceNotStr[str], PropertyInfo(alias="classNames")]] diff --git a/tests/api_resources/inference_pipelines/test_data.py b/tests/api_resources/inference_pipelines/test_data.py index 7c29f492..60727f56 100644 --- a/tests/api_resources/inference_pipelines/test_data.py +++ b/tests/api_resources/inference_pipelines/test_data.py @@ -55,7 +55,9 @@ def test_method_stream_with_all_params(self, client: Openlayer) -> None: } ], "question_column_name": "question", + "session_id_column_name": "session_id", "timestamp_column_name": "timestamp", + "user_id_column_name": "user_id", }, rows=[ { @@ -174,7 +176,9 @@ async def test_method_stream_with_all_params(self, async_client: AsyncOpenlayer) } ], "question_column_name": "question", + "session_id_column_name": "session_id", "timestamp_column_name": "timestamp", + "user_id_column_name": "user_id", }, rows=[ { From cb69e2e0a1765615efda7a7ff7af4badbb3b7c68 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 9 Sep 2025 15:18:02 +0000 Subject: [PATCH 5/8] chore(internal): version bump From 9730dc0d7e9ccbd5db08a9188caa3bff337a0d20 Mon Sep 17 00:00:00 2001 From: Gustavo Cid Date: Wed, 10 Sep 2025 15:19:00 -0300 Subject: [PATCH 6/8] chore: closes OPEN-7337 Exclude examples from linting action --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 1e633618..acbe765b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -174,7 +174,7 @@ show_error_codes = true # # We also exclude our `tests` as mypy doesn't always infer # types correctly and Pyright will still catch any type errors. -exclude = ['src/openlayer/_files.py', '_dev/.*.py', 'tests/.*'] +exclude = ['src/openlayer/_files.py', '_dev/.*.py', 'tests/.*', 'examples/.*'] strict_equality = true implicit_reexport = true From 89f0d2117df3ab07da397877cd24f5fbd0bca14d Mon Sep 17 00:00:00 2001 From: Gustavo Cid Date: Wed, 10 Sep 2025 15:21:19 -0300 Subject: [PATCH 7/8] chore: exclude custom lib from linting action --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index acbe765b..51008dbd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -174,7 +174,7 @@ show_error_codes = true # # We also exclude our `tests` as mypy doesn't always infer # types correctly and Pyright will still catch any type errors. -exclude = ['src/openlayer/_files.py', '_dev/.*.py', 'tests/.*', 'examples/.*'] +exclude = ['src/openlayer/_files.py', '_dev/.*.py', 'tests/.*', 'examples/.*', 'src/openlayer/lib/.*'] strict_equality = true implicit_reexport = true From 0f54788a46ad95ad5d3e56f3b4a1ff426ccbc233 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 10 Sep 2025 18:21:41 +0000 Subject: [PATCH 8/8] release: 0.2.0-alpha.93 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 29 +++++++++++++++++++++++++++++ pyproject.toml | 2 +- src/openlayer/_version.py | 2 +- 4 files changed, 32 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index a974052b..b200bc7a 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.2.0-alpha.92" + ".": "0.2.0-alpha.93" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index d7501349..d3b9b79d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,35 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.2.0-alpha.93 (2025-09-10) + +Full Changelog: [v0.2.0-alpha.92...v0.2.0-alpha.93](https://github.com/openlayer-ai/openlayer-python/compare/v0.2.0-alpha.92...v0.2.0-alpha.93) + +### Features + +* Add user_id and session_id in traces to track users and sessions ([b7cd032](https://github.com/openlayer-ai/openlayer-python/commit/b7cd032d7bc0ad80d5d025decc7db46720b81349)) +* **api:** api update ([e65c84e](https://github.com/openlayer-ai/openlayer-python/commit/e65c84e5420874636c405ddd5cce8dd2f4e69bbf)) + + +### Chores + +* closes OPEN-7337 Exclude examples from linting action ([9730dc0](https://github.com/openlayer-ai/openlayer-python/commit/9730dc0d7e9ccbd5db08a9188caa3bff337a0d20)) +* exclude custom lib from linting action ([89f0d21](https://github.com/openlayer-ai/openlayer-python/commit/89f0d2117df3ab07da397877cd24f5fbd0bca14d)) +* **internal:** move mypy configurations to `pyproject.toml` file ([49b32b4](https://github.com/openlayer-ai/openlayer-python/commit/49b32b4095ad06abda2ef43fc04edd3ba9620c52)) +* **internal:** version bump ([cb69e2e](https://github.com/openlayer-ai/openlayer-python/commit/cb69e2e0a1765615efda7a7ff7af4badbb3b7c68)) +* **internal:** version bump ([59e1a98](https://github.com/openlayer-ai/openlayer-python/commit/59e1a983a9b7e9975a34520e26055e7ef6b236cb)) +* **tests:** simplify `get_platform` test ([d30a165](https://github.com/openlayer-ai/openlayer-python/commit/d30a16505f86135c3f5980307a9ae073de1a4708)) + + +### Styles + +* reverted back to previous version for data_stream_params.py ([89d6a5d](https://github.com/openlayer-ai/openlayer-python/commit/89d6a5d4c1e47f13662dc95feee4dde27371318a)) + + +### Refactors + +* import fixes ([bd78a73](https://github.com/openlayer-ai/openlayer-python/commit/bd78a73b6d692d04c06f862a934767d87653ad8c)) + ## 0.2.0-alpha.92 (2025-09-09) Full Changelog: [v0.2.0-alpha.91...v0.2.0-alpha.92](https://github.com/openlayer-ai/openlayer-python/compare/v0.2.0-alpha.91...v0.2.0-alpha.92) diff --git a/pyproject.toml b/pyproject.toml index 51008dbd..0020ba8f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "openlayer" -version = "0.2.0-alpha.92" +version = "0.2.0-alpha.93" description = "The official Python library for the openlayer API" dynamic = ["readme"] license = "Apache-2.0" diff --git a/src/openlayer/_version.py b/src/openlayer/_version.py index 14d3ed6b..f821148a 100644 --- a/src/openlayer/_version.py +++ b/src/openlayer/_version.py @@ -1,4 +1,4 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. __title__ = "openlayer" -__version__ = "0.2.0-alpha.92" # x-release-please-version +__version__ = "0.2.0-alpha.93" # x-release-please-version