veris-ai 1.14.0__py3-none-any.whl → 1.14.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of veris-ai might be problematic. Click here for more details.
- veris_ai/api_client.py +31 -9
- veris_ai/tool_mock.py +6 -3
- {veris_ai-1.14.0.dist-info → veris_ai-1.14.2.dist-info}/METADATA +1 -1
- {veris_ai-1.14.0.dist-info → veris_ai-1.14.2.dist-info}/RECORD +6 -6
- {veris_ai-1.14.0.dist-info → veris_ai-1.14.2.dist-info}/WHEEL +0 -0
- {veris_ai-1.14.0.dist-info → veris_ai-1.14.2.dist-info}/licenses/LICENSE +0 -0
veris_ai/api_client.py
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
4
|
import os
|
|
5
|
+
from contextvars import ContextVar
|
|
5
6
|
from typing import Any
|
|
6
7
|
|
|
7
8
|
import httpx
|
|
@@ -9,6 +10,9 @@ from urllib.parse import urljoin
|
|
|
9
10
|
|
|
10
11
|
logger = logging.getLogger(__name__)
|
|
11
12
|
|
|
13
|
+
# Context variable to store base_url for per-request multi-tenant scenarios
|
|
14
|
+
_base_url_context: ContextVar[str | None] = ContextVar("veris_base_url", default=None)
|
|
15
|
+
|
|
12
16
|
|
|
13
17
|
class SimulatorAPIClient:
|
|
14
18
|
"""Centralized client for making requests to VERIS simulation endpoints.
|
|
@@ -20,12 +24,22 @@ class SimulatorAPIClient:
|
|
|
20
24
|
changes reflected without recreating the singleton.
|
|
21
25
|
"""
|
|
22
26
|
|
|
23
|
-
def __init__(self) -> None:
|
|
27
|
+
def __init__(self, timeout: float | None = None) -> None:
|
|
24
28
|
"""Initialize the API client with static timeout configuration."""
|
|
25
|
-
self.
|
|
29
|
+
self._timeout = timeout or float(os.getenv("VERIS_MOCK_TIMEOUT", "300.0"))
|
|
30
|
+
|
|
31
|
+
@property
|
|
32
|
+
def base_url(self) -> str:
|
|
33
|
+
"""Get the resolved base URL."""
|
|
34
|
+
return self._get_base_url()
|
|
26
35
|
|
|
27
36
|
def _get_base_url(self) -> str:
|
|
28
|
-
"""Resolve the base URL from environment.
|
|
37
|
+
"""Resolve the base URL from context, environment, or default.
|
|
38
|
+
|
|
39
|
+
Priority order:
|
|
40
|
+
1. Context variable (for per-request multi-tenant scenarios)
|
|
41
|
+
2. VERIS_API_URL environment variable
|
|
42
|
+
3. Default production URL
|
|
29
43
|
|
|
30
44
|
Behavior:
|
|
31
45
|
- If VERIS_API_URL is unset, default to the dev simulator URL.
|
|
@@ -33,7 +47,9 @@ class SimulatorAPIClient:
|
|
|
33
47
|
(do not fall back). This supports tests expecting connection
|
|
34
48
|
failures when an invalid endpoint is provided.
|
|
35
49
|
"""
|
|
36
|
-
|
|
50
|
+
# Priority: context > env var > default
|
|
51
|
+
context_url = _base_url_context.get()
|
|
52
|
+
return context_url or os.getenv("VERIS_API_URL") or "https://simulator.api.veris.ai"
|
|
37
53
|
|
|
38
54
|
def _build_headers(self) -> dict[str, str] | None:
|
|
39
55
|
"""Build headers including OpenTelemetry tracing and API key."""
|
|
@@ -55,7 +71,7 @@ class SimulatorAPIClient:
|
|
|
55
71
|
if not endpoint.startswith(("http://", "https://")):
|
|
56
72
|
raise httpx.ConnectError("Invalid endpoint URL (not absolute): {endpoint}")
|
|
57
73
|
|
|
58
|
-
with httpx.Client(timeout=self.
|
|
74
|
+
with httpx.Client(timeout=self._timeout) as client:
|
|
59
75
|
response = client.post(endpoint, json=payload, headers=headers)
|
|
60
76
|
response.raise_for_status()
|
|
61
77
|
return response.json() if response.content else None
|
|
@@ -73,7 +89,7 @@ class SimulatorAPIClient:
|
|
|
73
89
|
error_msg = f"Invalid endpoint URL (not absolute): {endpoint}"
|
|
74
90
|
raise httpx.ConnectError(error_msg)
|
|
75
91
|
|
|
76
|
-
async with httpx.AsyncClient(timeout=self.
|
|
92
|
+
async with httpx.AsyncClient(timeout=self._timeout) as client:
|
|
77
93
|
response = await client.post(endpoint, json=payload, headers=headers)
|
|
78
94
|
response.raise_for_status()
|
|
79
95
|
return response.json() if response.content else None
|
|
@@ -81,15 +97,15 @@ class SimulatorAPIClient:
|
|
|
81
97
|
@property
|
|
82
98
|
def tool_mock_endpoint(self) -> str:
|
|
83
99
|
"""Get the tool mock endpoint URL."""
|
|
84
|
-
return urljoin(self.
|
|
100
|
+
return urljoin(self.base_url, "v3/tool_mock")
|
|
85
101
|
|
|
86
102
|
def get_log_tool_call_endpoint(self, session_id: str) -> str:
|
|
87
103
|
"""Get the log tool call endpoint URL."""
|
|
88
|
-
return urljoin(self.
|
|
104
|
+
return urljoin(self.base_url, f"v3/log_tool_call?session_id={session_id}")
|
|
89
105
|
|
|
90
106
|
def get_log_tool_response_endpoint(self, session_id: str) -> str:
|
|
91
107
|
"""Get the log tool response endpoint URL."""
|
|
92
|
-
return urljoin(self.
|
|
108
|
+
return urljoin(self.base_url, f"v3/log_tool_response?session_id={session_id}")
|
|
93
109
|
|
|
94
110
|
|
|
95
111
|
# Global singleton instance
|
|
@@ -99,3 +115,9 @@ _api_client = SimulatorAPIClient()
|
|
|
99
115
|
def get_api_client() -> SimulatorAPIClient:
|
|
100
116
|
"""Get the global API client instance."""
|
|
101
117
|
return _api_client
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def set_api_client_params(timeout: float | None = None) -> None:
|
|
121
|
+
"""Set the global API client instance for testing purposes."""
|
|
122
|
+
global _api_client # noqa: PLW0603
|
|
123
|
+
_api_client = SimulatorAPIClient(timeout=timeout)
|
veris_ai/tool_mock.py
CHANGED
|
@@ -16,7 +16,7 @@ from typing import (
|
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
from veris_ai.models import ResponseExpectation, ToolCallOptions
|
|
19
|
-
from veris_ai.api_client import get_api_client
|
|
19
|
+
from veris_ai.api_client import _base_url_context, get_api_client
|
|
20
20
|
from veris_ai.utils import (
|
|
21
21
|
convert_to_type,
|
|
22
22
|
execute_callback,
|
|
@@ -92,6 +92,8 @@ class VerisSDK:
|
|
|
92
92
|
|
|
93
93
|
self._set_session_id(token_data["session_id"])
|
|
94
94
|
self._set_thread_id(token_data["thread_id"])
|
|
95
|
+
if token_data.get("api_url"):
|
|
96
|
+
_base_url_context.set(token_data["api_url"])
|
|
95
97
|
logger.info(
|
|
96
98
|
f"Session ID set to {token_data['session_id']}, "
|
|
97
99
|
f"Thread ID set to {token_data['thread_id']} - mocking enabled"
|
|
@@ -142,10 +144,11 @@ class VerisSDK:
|
|
|
142
144
|
_thread_id_context.set(None)
|
|
143
145
|
|
|
144
146
|
def clear_context(self) -> None:
|
|
145
|
-
"""Clear the session_id and
|
|
147
|
+
"""Clear the session_id, thread_id, and base_url from context variables."""
|
|
146
148
|
self._clear_session_id()
|
|
147
149
|
self._clear_thread_id()
|
|
148
|
-
|
|
150
|
+
_base_url_context.set(None)
|
|
151
|
+
logger.info("Session ID, Thread ID, and Base URL cleared - mocking disabled")
|
|
149
152
|
|
|
150
153
|
def clear_session_id(self) -> None:
|
|
151
154
|
"""DEPRECATED: Use clear_context() instead."""
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: veris-ai
|
|
3
|
-
Version: 1.14.
|
|
3
|
+
Version: 1.14.2
|
|
4
4
|
Summary: A Python package for Veris AI tools
|
|
5
5
|
Project-URL: Homepage, https://github.com/veris-ai/veris-python-sdk
|
|
6
6
|
Project-URL: Bug Tracker, https://github.com/veris-ai/veris-python-sdk/issues
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
veris_ai/README.md,sha256=Mxg9fyNt6hFkQaFBYZq85Kw9akw4cN2uu6j_mXZtNCs,3871
|
|
2
2
|
veris_ai/__init__.py,sha256=enl_gEa6BQAjWvzCtsn_hFVJVVlJZ_dMsLL--E5W3nU,1907
|
|
3
3
|
veris_ai/agents_wrapper.py,sha256=gLUd_0TyCVsqqilQLvsSJIpsU5uu2CdjjWOQ4QJjoJk,12786
|
|
4
|
-
veris_ai/api_client.py,sha256=
|
|
4
|
+
veris_ai/api_client.py,sha256=LevQnX9oK4wU1ehXUJiBxoJAkgnrZi1dQf88PkQfLRM,5040
|
|
5
5
|
veris_ai/models.py,sha256=xKeheSJQle2tBeJG1DsGJzMDwv24p5jECjX6RAa39n4,495
|
|
6
6
|
veris_ai/observability.py,sha256=eSIXmk6fpOAoWM-sDbsvzyUASh1ZwU6tRIPduy09RxY,4206
|
|
7
|
-
veris_ai/tool_mock.py,sha256=
|
|
7
|
+
veris_ai/tool_mock.py,sha256=D3a-w5j8_3oFALZYCSXkBGqxCeF0JUSULypjNbPQXjo,25153
|
|
8
8
|
veris_ai/utils.py,sha256=qwPPxS0CrsS36OoN_924hricz9jGRXx9FSDgLok0wgY,18940
|
|
9
9
|
veris_ai/jaeger_interface/README.md,sha256=kd9rKcE5xf3EyNaiHu0tjn-0oES9sfaK6Ih-OhhTyCM,2821
|
|
10
10
|
veris_ai/jaeger_interface/__init__.py,sha256=KD7NSiMYRG_2uF6dOLKkGG5lNQe4K9ptEwucwMT4_aw,1128
|
|
11
11
|
veris_ai/jaeger_interface/client.py,sha256=yJrh86wRR0Dk3Gq12DId99WogcMIVbL0QQFqVSevvlE,8772
|
|
12
12
|
veris_ai/jaeger_interface/models.py,sha256=e64VV6IvOEFuzRUgvDAMQFyOZMRb56I-PUPZLBZ3rX0,1864
|
|
13
|
-
veris_ai-1.14.
|
|
14
|
-
veris_ai-1.14.
|
|
15
|
-
veris_ai-1.14.
|
|
16
|
-
veris_ai-1.14.
|
|
13
|
+
veris_ai-1.14.2.dist-info/METADATA,sha256=UbnAoKMupmF6CyK_D32FWZJLAyGtwYdDWCR4bIwoq8M,16684
|
|
14
|
+
veris_ai-1.14.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
15
|
+
veris_ai-1.14.2.dist-info/licenses/LICENSE,sha256=2g4i20atAgtD5einaKzhQrIB-JrPhyQgD3bC0wkHcCI,1065
|
|
16
|
+
veris_ai-1.14.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|