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-10-10 15:00:21 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-langsmith (Old) and /work/SRC/openSUSE:Factory/.python-langsmith.new.3698736 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-langsmith" Sat Oct 10 15:00:21 2026 rev:35 rq:1383992 version:0.14.7 Changes: -------- --- /work/SRC/openSUSE:Factory/python-langsmith/python-langsmith.changes 2026-10-09 21:46:19.944714060 +0200 +++ /work/SRC/openSUSE:Factory/.python-langsmith.new.3698736/python-langsmith.changes 2026-10-10 15:00:42.660323586 +0200 @@ -1,0 +2,8 @@ +Sat Oct 10 06:38:02 UTC 2026 - Martin Pluskal <[email protected]> + +- Update to 0.14.7: + * Do not require a completions resource in wrap_anthropic + * Normalize sandbox API endpoint prefixes + * No new runtime dependencies; requires-python stays >= 3.10 + +------------------------------------------------------------------- Old: ---- langsmith-0.14.5.tar.gz New: ---- langsmith-0.14.7.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-langsmith.spec ++++++ --- /var/tmp/diff_new_pack.j49hMi/_old 2026-10-10 15:00:43.976378681 +0200 +++ /var/tmp/diff_new_pack.j49hMi/_new 2026-10-10 15:00:43.978378765 +0200 @@ -17,7 +17,7 @@ Name: python-langsmith -Version: 0.14.5 +Version: 0.14.7 Release: 0 Summary: Client library for the LangSmith LLM tracing and evaluation platform License: MIT ++++++ langsmith-0.14.5.tar.gz -> langsmith-0.14.7.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/langsmith-0.14.5/.bumpversion.cfg new/langsmith-0.14.7/.bumpversion.cfg --- old/langsmith-0.14.5/.bumpversion.cfg 2020-02-02 01:00:00.000000000 +0100 +++ new/langsmith-0.14.7/.bumpversion.cfg 2020-02-02 01:00:00.000000000 +0100 @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.14.5 +current_version = 0.14.7 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.14.5/PKG-INFO new/langsmith-0.14.7/PKG-INFO --- old/langsmith-0.14.5/PKG-INFO 2020-02-02 01:00:00.000000000 +0100 +++ new/langsmith-0.14.7/PKG-INFO 2020-02-02 01:00:00.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.5 Name: langsmith -Version: 0.14.5 +Version: 0.14.7 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.14.5/langsmith/__init__.py new/langsmith-0.14.7/langsmith/__init__.py --- old/langsmith-0.14.5/langsmith/__init__.py 2020-02-02 01:00:00.000000000 +0100 +++ new/langsmith-0.14.7/langsmith/__init__.py 2020-02-02 01:00:00.000000000 +0100 @@ -57,7 +57,7 @@ # Avoid calling into importlib on every call to __version__ -__version__ = "0.14.5" +__version__ = "0.14.7" 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.14.5/langsmith/sandbox/_async_client.py new/langsmith-0.14.7/langsmith/sandbox/_async_client.py --- old/langsmith-0.14.5/langsmith/sandbox/_async_client.py 2020-02-02 01:00:00.000000000 +0100 +++ new/langsmith-0.14.7/langsmith/sandbox/_async_client.py 2020-02-02 01:00:00.000000000 +0100 @@ -12,6 +12,7 @@ from langsmith import utils as ls_utils from langsmith._openapi_client import AsyncLangsmith from langsmith._openapi_client._httpx import httpx +from langsmith.client import _get_openapi_base_url from langsmith.sandbox._access_delegation import ( AccessDelegation, _validate_access_delegation, @@ -73,7 +74,7 @@ Derives the endpoint from LANGSMITH_ENDPOINT (or LANGCHAIN_ENDPOINT). """ base = ls_utils.get_env_var("ENDPOINT", default="https://api.smith.langchain.com") - return f"{base.rstrip('/')}/v2/sandboxes" + return f"{_get_openapi_base_url(base)}/api/v2/sandboxes" def _get_default_api_key() -> Optional[str]: @@ -164,7 +165,7 @@ """Return the API root URL, without the ``/v2/sandboxes`` suffix.""" suffix = "/v2/sandboxes" if self._base_url.endswith(suffix): - return self._base_url[: -len(suffix)] + return _get_openapi_base_url(self._base_url[: -len(suffix)]) return self._base_url @property diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/langsmith-0.14.5/langsmith/sandbox/_client.py new/langsmith-0.14.7/langsmith/sandbox/_client.py --- old/langsmith-0.14.5/langsmith/sandbox/_client.py 2020-02-02 01:00:00.000000000 +0100 +++ new/langsmith-0.14.7/langsmith/sandbox/_client.py 2020-02-02 01:00:00.000000000 +0100 @@ -16,6 +16,7 @@ from langsmith import utils as ls_utils from langsmith._openapi_client import Langsmith from langsmith._openapi_client._httpx import httpx +from langsmith.client import _get_openapi_base_url from langsmith.sandbox._access_delegation import ( AccessDelegation, _validate_access_delegation, @@ -69,7 +70,7 @@ Derives the endpoint from LANGSMITH_ENDPOINT (or LANGCHAIN_ENDPOINT). """ base = ls_utils.get_env_var("ENDPOINT", default="https://api.smith.langchain.com") - return f"{base.rstrip('/')}/v2/sandboxes" + return f"{_get_openapi_base_url(base)}/api/v2/sandboxes" def _get_default_api_key() -> Optional[str]: @@ -288,7 +289,7 @@ """Return the API root URL, without the ``/v2/sandboxes`` suffix.""" suffix = "/v2/sandboxes" if self._base_url.endswith(suffix): - return self._base_url[: -len(suffix)] + return _get_openapi_base_url(self._base_url[: -len(suffix)]) return self._base_url @property diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/langsmith-0.14.5/langsmith/wrappers/_anthropic.py new/langsmith-0.14.7/langsmith/wrappers/_anthropic.py --- old/langsmith-0.14.5/langsmith/wrappers/_anthropic.py 2020-02-02 01:00:00.000000000 +0100 +++ new/langsmith-0.14.7/langsmith/wrappers/_anthropic.py 2020-02-02 01:00:00.000000000 +0100 @@ -606,13 +606,15 @@ prepopulated_invocation_params, tracing_extra_rest, ) - client.completions.create = _get_wrapper( # type: ignore[method-assign] - client.completions.create, - completions_name, - _reduce_completions, - prepopulated_invocation_params, - tracing_extra_rest, - ) + # anthropic>=1.0 removed the legacy Text Completions resource. + if hasattr(client, "completions") and hasattr(client.completions, "create"): + client.completions.create = _get_wrapper( # type: ignore[method-assign] + client.completions.create, + completions_name, + _reduce_completions, + prepopulated_invocation_params, + tracing_extra_rest, + ) if ( hasattr(client, "beta") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/langsmith-0.14.5/tests/unit_tests/sandbox/test_endpoints.py new/langsmith-0.14.7/tests/unit_tests/sandbox/test_endpoints.py --- old/langsmith-0.14.5/tests/unit_tests/sandbox/test_endpoints.py 1970-01-01 01:00:00.000000000 +0100 +++ new/langsmith-0.14.7/tests/unit_tests/sandbox/test_endpoints.py 2020-02-02 01:00:00.000000000 +0100 @@ -0,0 +1,57 @@ +import pytest +from pytest_httpx import HTTPXMock + +from langsmith import utils +from langsmith.sandbox import AsyncSandboxClient, SandboxClient + + [email protected](autouse=True) +def clear_env_cache(): + utils.get_env_var.cache_clear() + yield + utils.get_env_var.cache_clear() + + [email protected]( + "host", + [ + "https://ls.example.com", + "https://eu.api.smith.langchain.com", + "https://ls.example.com/prefix", + ], +) [email protected]("suffix", ["", "/", "/api", "/api/", "/api/v1", "/api/v1/"]) [email protected]("explicit", [False, True]) [email protected]("async_client", [False, True]) +async def test_endpoint_requests( + monkeypatch, httpx_mock: HTTPXMock, host, suffix, explicit, async_client +): + monkeypatch.setenv("LANGSMITH_ENDPOINT", host + suffix) + endpoint = host + "/api/v2/sandboxes/" if explicit else None + httpx_mock.add_response( + url=host + "/api/v2/sandboxes/boxes", json={"sandboxes": []} + ) + httpx_mock.add_response( + url=host + "/api/v2/sandboxes/registries", json={"registries": []} + ) + if async_client: + async with AsyncSandboxClient(api_endpoint=endpoint, api_key="test") as client: + await client.list_sandboxes() + await client.registries.list() + else: + with SandboxClient(api_endpoint=endpoint, api_key="test") as client: + client.list_sandboxes() + client.registries.list() + + [email protected]("client_class", [SandboxClient, AsyncSandboxClient]) +async def test_default_endpoint(monkeypatch, client_class): + monkeypatch.delenv("LANGSMITH_ENDPOINT", raising=False) + monkeypatch.delenv("LANGCHAIN_ENDPOINT", raising=False) + client = client_class(api_key="test") + assert client._base_url == "https://api.smith.langchain.com/api/v2/sandboxes" + assert client._api_root() == "https://api.smith.langchain.com" + if isinstance(client, AsyncSandboxClient): + await client.aclose() + else: + client.close() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/langsmith-0.14.5/tests/unit_tests/wrappers/test_anthropic_processing.py new/langsmith-0.14.7/tests/unit_tests/wrappers/test_anthropic_processing.py --- old/langsmith-0.14.5/tests/unit_tests/wrappers/test_anthropic_processing.py 2020-02-02 01:00:00.000000000 +0100 +++ new/langsmith-0.14.7/tests/unit_tests/wrappers/test_anthropic_processing.py 2020-02-02 01:00:00.000000000 +0100 @@ -1,6 +1,7 @@ """Unit tests for Anthropic wrapper processing functions.""" import warnings +from types import SimpleNamespace from unittest.mock import MagicMock import pytest @@ -333,3 +334,45 @@ def test_none_is_dropped_by_strip_not_given(self) -> None: assert "mcp_servers" not in _strip_not_given({"mcp_servers": None}) + + +class TestWrapAnthropicCompletions: + """wrap_anthropic must tolerate clients without the legacy completions resource.""" + + @staticmethod + def _messages() -> SimpleNamespace: + def create(*args, **kwargs): + return None + + def stream(*args, **kwargs): + return None + + return SimpleNamespace(create=create, stream=stream) + + def test_client_without_completions(self): + from langsmith.wrappers import wrap_anthropic + + messages = self._messages() + original_create = messages.create + client = SimpleNamespace(messages=messages) + + wrapped = wrap_anthropic(client) # type: ignore[type-var] + + assert wrapped is client + assert not hasattr(client, "completions") + assert client.messages.create is not original_create + + def test_client_with_completions_is_still_wrapped(self): + from langsmith.wrappers import wrap_anthropic + + def completions_create(*args, **kwargs): + return None + + client = SimpleNamespace( + messages=self._messages(), + completions=SimpleNamespace(create=completions_create), + ) + + wrap_anthropic(client) # type: ignore[type-var] + + assert client.completions.create is not completions_create
