a7d6d88f6f
CI / changes (push) Has been cancelled
CI / cd libs/checkpoint (push) Has been cancelled
CI / cd libs/checkpoint-conformance (push) Has been cancelled
CI / cd libs/checkpoint-postgres (push) Has been cancelled
CI / cd libs/checkpoint-sqlite (push) Has been cancelled
CI / cd libs/cli (push) Has been cancelled
CI / cd libs/prebuilt (push) Has been cancelled
CI / cd libs/sdk-py (push) Has been cancelled
CI / cd libs/langgraph (push) Has been cancelled
CI / Check SDK methods matching (push) Has been cancelled
CI / Check CLI schema hasn't changed #3.13 (push) Has been cancelled
CI / CLI integration test (push) Has been cancelled
CI / sdk-py integration test (push) Has been cancelled
CI / CI Success (push) Has been cancelled
baseline / benchmark (push) Has been cancelled
Deploy Redirects to GitHub Pages / deploy (push) Has been cancelled
71 lines
2.3 KiB
Python
71 lines
2.3 KiB
Python
"""Shared fixtures for the integration suite.
|
|
|
|
These tests require a running langgraph-api server at `LANGGRAPH_INTEGRATION_URL`
|
|
(defaults to `http://localhost:2024`). Stand it up via the docker stack in
|
|
`libs/sdk-py/integration/`:
|
|
|
|
cd libs/sdk-py/integration && docker compose up -d
|
|
|
|
The `integration` marker is registered in `pyproject.toml` and excluded by
|
|
default in pytest's `addopts`; opt in with `pytest -m integration`.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
from collections.abc import AsyncIterator, Iterator
|
|
|
|
import httpx
|
|
import pytest
|
|
|
|
BASE_URL = os.environ.get("LANGGRAPH_INTEGRATION_URL", "http://localhost:2024")
|
|
ASSISTANT_ID = "agent"
|
|
TOOLS_ASSISTANT_ID = "tools_agent"
|
|
DEEP_AGENT_ASSISTANT_ID = "deep_agent"
|
|
FACTORY_ASSISTANT_ID = "factory_agent"
|
|
|
|
EXPECTED_TERMINAL_ITEMS = ["streamed", "tool", "asked", "sub"]
|
|
|
|
|
|
@pytest.fixture(scope="session", autouse=True)
|
|
def _require_running_api() -> None:
|
|
"""Skip the whole integration suite if the API isn't reachable.
|
|
|
|
Autouse + session-scoped so a missing stack short-circuits before any
|
|
test runs (no per-test connection timeouts piling up).
|
|
"""
|
|
try:
|
|
resp = httpx.get(f"{BASE_URL}/ok", timeout=2.0)
|
|
resp.raise_for_status()
|
|
except Exception as err:
|
|
pytest.skip(
|
|
f"langgraph-api not reachable at {BASE_URL}: {err!r}. "
|
|
f"Bring up the stack with `cd libs/sdk-py/integration && docker compose up -d`."
|
|
)
|
|
|
|
|
|
@pytest.fixture
|
|
async def async_threads() -> AsyncIterator[tuple[object, httpx.AsyncClient]]:
|
|
"""Build an async ThreadsClient. Yields `(threads, raw_httpx)` so tests can close raw."""
|
|
from langgraph_sdk._async.http import HttpClient
|
|
from langgraph_sdk._async.threads import ThreadsClient
|
|
|
|
raw = httpx.AsyncClient(base_url=BASE_URL, timeout=30.0)
|
|
try:
|
|
yield ThreadsClient(HttpClient(raw)), raw
|
|
finally:
|
|
await raw.aclose()
|
|
|
|
|
|
@pytest.fixture
|
|
def sync_threads() -> Iterator[tuple[object, httpx.Client]]:
|
|
"""Build a sync ThreadsClient. Yields `(threads, raw_httpx)` so tests can close raw."""
|
|
from langgraph_sdk._sync.http import SyncHttpClient
|
|
from langgraph_sdk._sync.threads import SyncThreadsClient
|
|
|
|
raw = httpx.Client(base_url=BASE_URL, timeout=30.0)
|
|
try:
|
|
yield SyncThreadsClient(SyncHttpClient(raw)), raw
|
|
finally:
|
|
raw.close()
|