Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-langsmith for
openSUSE:Factory checked in at 2026-07-07 21:04:29
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-langsmith (Old)
and /work/SRC/openSUSE:Factory/.python-langsmith.new.1982 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-langsmith"
Tue Jul 7 21:04:29 2026 rev:5 rq:1364317 version:0.9.8
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-langsmith/python-langsmith.changes
2026-07-03 16:06:08.555810982 +0200
+++
/work/SRC/openSUSE:Factory/.python-langsmith.new.1982/python-langsmith.changes
2026-07-07 21:07:27.051109632 +0200
@@ -1,0 +2,32 @@
+Tue Jul 7 12:45:27 UTC 2026 - Bernhard Wiedemann <[email protected]>
+
+- Fix variations from %check (boo#1227364)
+
+-------------------------------------------------------------------
+Tue Jul 7 07:43:30 UTC 2026 - Martin Pluskal <[email protected]>
+
+- Update to 0.9.8:
+ * Add an asynchronous aread_project() client method to read a
+ tracing project (by id or name, optionally with aggregate
+ statistics) without blocking
+ * Rename the client-facing online_evaluators accessor to
+ evaluators for clearer nomenclature
+ * Drop the asynchronous projects resource accessor
+
+-------------------------------------------------------------------
+Fri Jul 3 09:46:35 UTC 2026 - Martin Pluskal <[email protected]>
+
+- Lower dependency floors to the versions shipped by openSUSE
+ Leap 16.0 (verified not to change functionality):
+ * websockets: require >= 14.2 instead of >= 15.0; only the
+ sync and asyncio connect() calls with additional_headers
+ and open_timeout are used, both available since websockets
+ 14.0
+ * zstandard: require >= 0.22.0 instead of >= 0.23.0; only
+ ZstdCompressor().stream_writer() with closefd is used,
+ available since zstandard 0.15.0
+ Verified by a full package build whose unit test suite
+ (332 passed) succeeds against Leap's websockets 14.2 and
+ zstandard 0.22.0.
+
+-------------------------------------------------------------------
Old:
----
langsmith-0.9.7.tar.gz
New:
----
langsmith-0.9.8.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-langsmith.spec ++++++
--- /var/tmp/diff_new_pack.6EnKLm/_old 2026-07-07 21:07:27.619129406 +0200
+++ /var/tmp/diff_new_pack.6EnKLm/_new 2026-07-07 21:07:27.619129406 +0200
@@ -17,7 +17,7 @@
Name: python-langsmith
-Version: 0.9.7
+Version: 0.9.8
Release: 0
Summary: Client library for the LangSmith LLM tracing and evaluation
platform
License: MIT
@@ -38,9 +38,9 @@
Requires: python-sniffio >= 1.1
Requires: python-typing_extensions >= 4.0.0
Requires: python-uuid-utils >= 0.12.0
-Requires: python-websockets >= 15.0
+Requires: python-websockets >= 14.2
Requires: python-xxhash >= 3.0.0
-Requires: python-zstandard >= 0.23.0
+Requires: python-zstandard >= 0.22.0
BuildArch: noarch
# SECTION test requirements
BuildRequires: %{python_module anyio >= 3.5.0}
@@ -61,9 +61,9 @@
BuildRequires: %{python_module sniffio >= 1.1}
BuildRequires: %{python_module typing_extensions >= 4.0.0}
BuildRequires: %{python_module uuid-utils >= 0.12.0}
-BuildRequires: %{python_module websockets >= 15.0}
+BuildRequires: %{python_module websockets >= 14.2}
BuildRequires: %{python_module xxhash >= 3.0.0}
-BuildRequires: %{python_module zstandard >= 0.23.0}
+BuildRequires: %{python_module zstandard >= 0.22.0}
# /SECTION
%python_subpackages
@@ -82,6 +82,10 @@
%install
%pyproject_install
+# Recompile the installed modules as hash-based bytecode: this package ships
+# many modules, so timestamp-based .pyc desync from the reproducibility-clamped
+# .py mtimes and trip python-bytecode-inconsistent-mtime.
+%python_expand $python -m compileall -q -f --invalidation-mode=unchecked-hash
-o 0 -o 1 -s %{buildroot} %{buildroot}%{$python_sitelib}/langsmith
%python_expand %fdupes %{buildroot}%{$python_sitelib}
%check
@@ -91,13 +95,6 @@
# langchain-core (which depends on langsmith -> build cycle);
# test_hybrid_tracing.py carries an upstream module-level pytest.skip.
%pytest tests/unit_tests -p no:langsmith_plugin --ignore
tests/unit_tests/wrappers --ignore tests/unit_tests/sandbox --ignore
tests/unit_tests/cli --ignore tests/unit_tests/evaluation --ignore
tests/unit_tests/test_async_client.py --ignore tests/unit_tests/test_client.py
--ignore tests/unit_tests/test_run_helpers.py --ignore
tests/unit_tests/test_hybrid_tracing.py -k 'not test_client_gc and not
test_git_info and not test_as_runnable'
-# Recompile the installed modules as hash-based bytecode: this package ships
-# many modules, so timestamp-based .pyc desync from the reproducibility-clamped
-# .py mtimes and trip python-bytecode-inconsistent-mtime.
-%python_expand $python -m compileall -q -f --invalidation-mode=unchecked-hash
-o 0 -o 1 -s %{buildroot} %{buildroot}%{$python_sitelib}/langsmith
-# Re-link the freshly compiled identical .pyc/.opt-1.pyc (brp-python-hardlink
-# already ran before %%check).
-%python_expand %fdupes %{buildroot}%{$python_sitelib}/langsmith
%files %{python_files}
%doc README.md
++++++ langsmith-0.9.7.tar.gz -> langsmith-0.9.8.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/langsmith-0.9.7/.bumpversion.cfg
new/langsmith-0.9.8/.bumpversion.cfg
--- old/langsmith-0.9.7/.bumpversion.cfg 2020-02-02 01:00:00.000000000
+0100
+++ new/langsmith-0.9.8/.bumpversion.cfg 2020-02-02 01:00:00.000000000
+0100
@@ -1,5 +1,5 @@
[bumpversion]
-current_version = 0.9.7
+current_version = 0.9.8
parse = (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)
serialize = {major}.{minor}.{patch}
search = {current_version}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/langsmith-0.9.7/PKG-INFO new/langsmith-0.9.8/PKG-INFO
--- old/langsmith-0.9.7/PKG-INFO 2020-02-02 01:00:00.000000000 +0100
+++ new/langsmith-0.9.8/PKG-INFO 2020-02-02 01:00:00.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: langsmith
-Version: 0.9.7
+Version: 0.9.8
Summary: Client library to connect to the LangSmith Observability and
Evaluation Platform.
Project-URL: Homepage, https://smith.langchain.com/
Project-URL: Documentation, https://docs.smith.langchain.com/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/langsmith-0.9.7/langsmith/__init__.py
new/langsmith-0.9.8/langsmith/__init__.py
--- old/langsmith-0.9.7/langsmith/__init__.py 2020-02-02 01:00:00.000000000
+0100
+++ new/langsmith-0.9.8/langsmith/__init__.py 2020-02-02 01:00:00.000000000
+0100
@@ -29,7 +29,7 @@
# Avoid calling into importlib on every call to __version__
-__version__ = "0.9.7"
+__version__ = "0.9.8"
version = __version__ # for backwards compatibility
# Metadata key to hide a traced run from LangSmith's Messages View.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/langsmith-0.9.7/langsmith/async_client.py
new/langsmith-0.9.8/langsmith/async_client.py
--- old/langsmith-0.9.7/langsmith/async_client.py 2020-02-02
01:00:00.000000000 +0100
+++ new/langsmith-0.9.8/langsmith/async_client.py 2020-02-02
01:00:00.000000000 +0100
@@ -50,7 +50,7 @@
AsyncDatasetsResource,
)
from langsmith._openapi_client.resources.online_evaluators import (
- AsyncOnlineEvaluatorsResource,
+ AsyncOnlineEvaluatorsResource as AsyncEvaluatorsResource,
)
from langsmith._openapi_client.resources.sandboxes.sandboxes import (
AsyncSandboxesResource,
@@ -314,8 +314,8 @@
return self._langsmith_api.runs
@property
- def online_evaluators(self) -> AsyncOnlineEvaluatorsResource:
- """Access the online evaluator resource."""
+ def evaluators(self) -> AsyncEvaluatorsResource:
+ """Access the evaluator resource."""
return self._langsmith_api.online_evaluators
@property
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/langsmith-0.9.7/langsmith/client.py
new/langsmith-0.9.8/langsmith/client.py
--- old/langsmith-0.9.7/langsmith/client.py 2020-02-02 01:00:00.000000000
+0100
+++ new/langsmith-0.9.8/langsmith/client.py 2020-02-02 01:00:00.000000000
+0100
@@ -17,6 +17,7 @@
import collections
import concurrent.futures as cf
import contextlib
+import contextvars
import datetime
import functools
import importlib
@@ -69,6 +70,7 @@
from langsmith import env as ls_env
from langsmith import schemas as ls_schemas
from langsmith import utils as ls_utils
+from langsmith._internal import _aiter as aitertools
from langsmith._internal import _orjson, _profiles
from langsmith._internal._backend_version import _check_backend_version
from langsmith._internal._background_thread import (
@@ -268,13 +270,12 @@
AsyncDatasetsResource,
)
from langsmith._openapi_client.resources.online_evaluators import (
- AsyncOnlineEvaluatorsResource,
+ AsyncOnlineEvaluatorsResource as AsyncEvaluatorsResource,
)
from langsmith._openapi_client.resources.runs import AsyncRunsResource
from langsmith._openapi_client.resources.sandboxes.sandboxes import (
AsyncSandboxesResource,
)
- from langsmith._openapi_client.resources.sessions import
AsyncSessionsResource
# OTEL imports for type hints
try:
@@ -1467,8 +1468,8 @@
return self._get_langsmith_api().runs
@property
- def online_evaluators(self) -> AsyncOnlineEvaluatorsResource:
- """Access the online evaluator resource."""
+ def evaluators(self) -> AsyncEvaluatorsResource:
+ """Access the evaluator resource."""
_check_backend_version(self.info.version)
return self._get_langsmith_api().online_evaluators
@@ -1479,12 +1480,6 @@
return self._get_langsmith_api().sandboxes
@property
- def projects(self) -> AsyncSessionsResource:
- """Access the projects resource."""
- _check_backend_version(self.info.version)
- return self._get_langsmith_api().sessions
-
- @property
def datasets(self) -> AsyncDatasetsResource:
"""Access the v2 datasets resource (experiment_runs, etc.)."""
_check_backend_version(self.info.version)
@@ -4982,6 +4977,34 @@
**response.json(), _host_url=self._host_url
)
+ async def aread_project(
+ self,
+ *,
+ project_id: Optional[str] = None,
+ project_name: Optional[str] = None,
+ include_stats: bool = False,
+ ) -> ls_schemas.TracerSessionResult:
+ """Asynchronously read a project from the LangSmith API.
+
+ Args:
+ project_id (Optional[str]):
+ The ID of the project to read.
+ project_name (Optional[str]): The name of the project to read.
+ Only one of project_id or project_name may be given.
+ include_stats (bool, default=False):
+ Whether to include a project's aggregate statistics in the
response.
+
+ Returns:
+ TracerSessionResult: The project.
+ """
+ return await aitertools.aio_to_thread(
+ contextvars.copy_context(),
+ self.read_project,
+ project_id=project_id,
+ project_name=project_name,
+ include_stats=include_stats,
+ )
+
def has_project(
self, project_name: str, *, project_id: Optional[str] = None
) -> bool:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/langsmith-0.9.7/tests/integration_tests/test_client.py
new/langsmith-0.9.8/tests/integration_tests/test_client.py
--- old/langsmith-0.9.7/tests/integration_tests/test_client.py 2020-02-02
01:00:00.000000000 +0100
+++ new/langsmith-0.9.8/tests/integration_tests/test_client.py 2020-02-02
01:00:00.000000000 +0100
@@ -122,17 +122,17 @@
)
-async def test_online_evaluators_generated_client_crud(
+async def test_evaluators_generated_client_crud(
langchain_client: Client,
) -> None:
- """Exercise the generated OpenAPI online evaluators resource end to end."""
+ """Exercise the generated OpenAPI evaluators resource end to end."""
evaluator = None
- name = "__sdk_online_evaluator_integration_" + "".join(
+ name = "__sdk_evaluator_integration_" + "".join(
random.sample(string.ascii_lowercase, 10)
)
try:
- created = await langchain_client.online_evaluators.create(
+ created = await langchain_client.evaluators.create(
name=name,
type="code",
code_evaluator={
@@ -146,12 +146,12 @@
assert evaluator.name == name
assert evaluator.type == "code"
- retrieved = await
langchain_client.online_evaluators.retrieve(evaluator.id)
+ retrieved = await langchain_client.evaluators.retrieve(evaluator.id)
assert retrieved.id == evaluator.id
assert retrieved.name == name
updated_name = f"{name}_updated"
- updated = await langchain_client.online_evaluators.update(
+ updated = await langchain_client.evaluators.update(
evaluator.id,
name=updated_name,
)
@@ -160,18 +160,43 @@
evaluators = [
item
- async for item in langchain_client.online_evaluators.list(
+ async for item in langchain_client.evaluators.list(
name_contains=updated_name, limit=10
)
]
assert evaluator.id in {item.id for item in evaluators}
finally:
if evaluator is not None and evaluator.id is not None:
- await langchain_client.online_evaluators.delete(
+ await langchain_client.evaluators.delete(
evaluator.id, delete_run_rules=True
)
+async def test_aread_project(langchain_client: Client) -> None:
+ """Exercise the async aread_project method against the LangSmith API."""
+ project_name = "__sdk_aread_project_integration_" + "".join(
+ random.sample(string.ascii_lowercase, 10)
+ )
+ created = langchain_client.create_project(project_name)
+ try:
+ project = await
langchain_client.aread_project(project_name=project_name)
+ assert project.id == created.id
+ assert project.name == project_name
+
+ project_by_id = await langchain_client.aread_project(
+ project_id=str(created.id), include_stats=True
+ )
+ assert project_by_id.id == created.id
+
+ nonexistent_name = "__sdk_aread_project_missing_" + "".join(
+ random.sample(string.ascii_lowercase, 10)
+ )
+ with pytest.raises(LangSmithNotFoundError):
+ await langchain_client.aread_project(project_name=nonexistent_name)
+ finally:
+ langchain_client.delete_project(project_name=project_name)
+
+
def test_datasets(parameterized_multipart_client: Client) -> None:
"""Test datasets."""
csv_content = "col1,col2\nval1,val2"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/langsmith-0.9.7/tests/integration_tests/test_projects.py
new/langsmith-0.9.8/tests/integration_tests/test_projects.py
--- old/langsmith-0.9.7/tests/integration_tests/test_projects.py
2020-02-02 01:00:00.000000000 +0100
+++ new/langsmith-0.9.8/tests/integration_tests/test_projects.py
1970-01-01 01:00:00.000000000 +0100
@@ -1,93 +0,0 @@
-"""Integration tests for Client.projects (AsyncSessionsResource)."""
-
-from __future__ import annotations
-
-import random
-import string
-
-import pytest
-
-from langsmith._openapi_client._exceptions import NotFoundError
-from langsmith.client import Client
-
-
-def _rand_name(prefix: str = "__sdk_test_project_") -> str:
- return prefix + "".join(random.sample(string.ascii_lowercase, 10))
-
-
[email protected]
-def client() -> Client:
- return Client()
-
-
-async def test_projects_create(client: Client) -> None:
- """create() returns a project with the given name and description."""
- name = _rand_name()
- project_id = None
- try:
- created = await client.projects.create(name=name, description="sdk
test")
- project_id = created.id
- assert project_id is not None
- assert created.name == name
- finally:
- if project_id is not None:
- await client.projects.delete(str(project_id))
-
-
-async def test_projects_retrieve(client: Client) -> None:
- """retrieve() returns the project matching the given session_id."""
- name = _rand_name()
- project_id = None
- try:
- created = await client.projects.create(name=name)
- project_id = created.id
- retrieved = await client.projects.retrieve(str(project_id))
- assert str(retrieved.id) == str(project_id)
- assert retrieved.name == name
- finally:
- if project_id is not None:
- await client.projects.delete(str(project_id))
-
-
-async def test_projects_update(client: Client) -> None:
- """update() applies the given fields to an existing project."""
- name = _rand_name()
- project_id = None
- try:
- created = await client.projects.create(name=name)
- project_id = created.id
- updated_name = name + "_updated"
- updated = await client.projects.update(
- str(project_id),
- name=updated_name,
- description="updated description",
- )
- assert updated.id == project_id
- assert updated.name == updated_name
- finally:
- if project_id is not None:
- await client.projects.delete(str(project_id))
-
-
-async def test_projects_list(client: Client) -> None:
- """list() returns an async iterable that includes the created project."""
- name = _rand_name()
- project_id = None
- try:
- created = await client.projects.create(name=name)
- project_id = created.id
- results = [p async for p in client.projects.list(name=name, limit=10)]
- assert any(str(p.id) == str(project_id) for p in results)
- finally:
- if project_id is not None:
- await client.projects.delete(str(project_id))
-
-
-async def test_projects_delete(client: Client) -> None:
- """delete() removes the project so a subsequent retrieve raises."""
- name = _rand_name()
- created = await client.projects.create(name=name)
- project_id = str(created.id)
- await client.projects.delete(project_id)
- with pytest.raises(NotFoundError):
- await client.projects.retrieve(project_id)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/langsmith-0.9.7/tests/unit_tests/test_client.py
new/langsmith-0.9.8/tests/unit_tests/test_client.py
--- old/langsmith-0.9.7/tests/unit_tests/test_client.py 2020-02-02
01:00:00.000000000 +0100
+++ new/langsmith-0.9.8/tests/unit_tests/test_client.py 2020-02-02
01:00:00.000000000 +0100
@@ -877,7 +877,7 @@
client.update_run(id_, status="completed")
-def test_online_evaluators_uses_generated_openapi_resource() -> None:
+def test_evaluators_uses_generated_openapi_resource() -> None:
resource = object()
with mock.patch("langsmith.client.LangsmithOpenAPIClient") as
openapi_client:
@@ -891,7 +891,7 @@
info=ls_schemas.LangSmithInfo(),
)
- assert client.online_evaluators is resource
+ assert client.evaluators is resource
openapi_client.assert_called_once()
assert openapi_client.call_args.kwargs["api_key"] == "test-api-key"
@@ -902,7 +902,7 @@
assert timeout.read == 5.678
-def test_async_online_evaluators_uses_generated_openapi_resource() -> None:
+def test_async_evaluators_uses_generated_openapi_resource() -> None:
resource = object()
with mock.patch("langsmith._openapi_client.AsyncLangsmith") as
openapi_client:
@@ -915,7 +915,7 @@
timeout_ms=(1234, 5678),
)
- assert client.online_evaluators is resource
+ assert client.evaluators is resource
openapi_client.assert_called_once()
assert openapi_client.call_args.kwargs["api_key"] == "test-api-key"