veris-ai 0.1.0__tar.gz

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.

@@ -0,0 +1,130 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ *.egg-info/
24
+ .installed.cfg
25
+ *.egg
26
+ MANIFEST
27
+
28
+ # PyInstaller
29
+ *.manifest
30
+ *.spec
31
+
32
+ # Installer logs
33
+ pip-log.txt
34
+ pip-delete-this-directory.txt
35
+
36
+ # Unit test / coverage reports
37
+ htmlcov/
38
+ .tox/
39
+ .nox/
40
+ .coverage
41
+ .coverage.*
42
+ .cache
43
+ nosetests.xml
44
+ coverage.xml
45
+ *.cover
46
+ .hypothesis/
47
+ .pytest_cache/
48
+
49
+ # Translations
50
+ *.mo
51
+ *.pot
52
+
53
+ # Django stuff:
54
+ *.log
55
+ local_settings.py
56
+ db.sqlite3
57
+
58
+ # Flask stuff:
59
+ instance/
60
+ .webassets-cache
61
+
62
+ # Scrapy stuff:
63
+ .scrapy
64
+
65
+ # Sphinx documentation
66
+ docs/_build/
67
+
68
+ # PyBuilder
69
+ target/
70
+
71
+ # Jupyter Notebook
72
+ .ipynb_checkpoints
73
+
74
+ # IPython
75
+ profile_default/
76
+ ipython_config.py
77
+
78
+ # pyenv
79
+ .python-version
80
+
81
+ # celery beat schedule file
82
+ celerybeat-schedule
83
+
84
+ # SageMath parsed files
85
+ *.sage.py
86
+
87
+ # Environments
88
+ .env
89
+ .venv
90
+ env/
91
+ venv/
92
+ ENV/
93
+ env.bak/
94
+ venv.bak/
95
+
96
+ # Spyder project settings
97
+ .spyderproject
98
+ .spyproject
99
+
100
+ # Rope project settings
101
+ .ropeproject
102
+
103
+ # mkdocs documentation
104
+ /site
105
+
106
+ # mypy
107
+ .mypy_cache/
108
+ .dmypy.json
109
+ dmypy.json
110
+
111
+ # Pyre type checker
112
+ .pyre/
113
+
114
+ # pytype static type analyzer
115
+ .pytype/
116
+
117
+ # Cython debug symbols
118
+ cython_debug/
119
+
120
+ # VS Code
121
+ .vscode/
122
+
123
+ # PyCharm
124
+ .idea/
125
+
126
+ # macOS
127
+ .DS_Store
128
+
129
+ # Windows
130
+ Thumbs.db
veris_ai-0.1.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Veris AI
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,139 @@
1
+ Metadata-Version: 2.4
2
+ Name: veris-ai
3
+ Version: 0.1.0
4
+ Summary: A Python package for Veris AI tools
5
+ Project-URL: Homepage, https://github.com/veris-ai/veris-python-sdk
6
+ Project-URL: Bug Tracker, https://github.com/veris-ai/veris-python-sdk/issues
7
+ Author-email: Mehdi Jamei <mehdi@veris.ai>
8
+ License-Expression: MIT
9
+ License-File: LICENSE
10
+ Requires-Python: >=3.11
11
+ Requires-Dist: httpx>=0.24.0
12
+ Requires-Dist: python-dotenv>=1.0.0
13
+ Requires-Dist: typing-extensions>=4.0.0
14
+ Provides-Extra: dev
15
+ Requires-Dist: black>=23.7.0; extra == 'dev'
16
+ Requires-Dist: mypy>=1.5.1; extra == 'dev'
17
+ Requires-Dist: pre-commit>=3.3.3; extra == 'dev'
18
+ Requires-Dist: pytest-asyncio>=0.21.1; extra == 'dev'
19
+ Requires-Dist: pytest-cov>=4.1.0; extra == 'dev'
20
+ Requires-Dist: pytest>=7.4.0; extra == 'dev'
21
+ Requires-Dist: ruff>=0.11.4; extra == 'dev'
22
+ Description-Content-Type: text/markdown
23
+
24
+ # Veris AI Python SDK
25
+
26
+ A Python package for Veris AI tools with simulation capabilities.
27
+
28
+ ## Installation
29
+
30
+ You can install the package using `uv`:
31
+
32
+ ```bash
33
+ # Install the package
34
+ uv add veris-ai
35
+
36
+ # Install with development dependencies
37
+ uv add "veris-ai[dev]"
38
+ ```
39
+
40
+ ## Environment Setup
41
+
42
+ The package requires the following environment variables:
43
+
44
+ ```bash
45
+ # Required: URL for the mock endpoint
46
+ VERIS_MOCK_ENDPOINT_URL=http://your-mock-endpoint.com
47
+
48
+ # Optional: Timeout in seconds (default: 30.0)
49
+ VERIS_MOCK_TIMEOUT=30.0
50
+
51
+ # Optional: Set to "simulation" to enable mock mode
52
+ ENV=simulation
53
+ ```
54
+
55
+ ## Python Version
56
+
57
+ This project requires Python 3.11 or higher. We use [pyenv](https://github.com/pyenv/pyenv) for Python version management.
58
+
59
+ To set up the correct Python version:
60
+
61
+ ```bash
62
+ # Install Python 3.11.0 using pyenv
63
+ pyenv install 3.11.0
64
+
65
+ # Set the local Python version for this project
66
+ pyenv local 3.11.0
67
+ ```
68
+
69
+ ## Usage
70
+
71
+ ```python
72
+ from veris_ai import veris
73
+
74
+ @veris.mock()
75
+ async def your_function(param1: str, param2: int) -> dict:
76
+ """
77
+ Your function documentation here.
78
+
79
+ Args:
80
+ param1: Description of param1
81
+ param2: Description of param2
82
+
83
+ Returns:
84
+ A dictionary containing the results
85
+ """
86
+ # Your implementation here
87
+ return {"result": "actual implementation"}
88
+ ```
89
+
90
+ When `ENV=simulation` is set, the decorator will:
91
+ 1. Capture the function signature, type hints, and docstring
92
+ 2. Send this information to the mock endpoint
93
+ 3. Convert the mock response to the expected return type
94
+ 4. Return the mock result
95
+
96
+ When not in simulation mode, the original function will be executed normally.
97
+
98
+ ## Development
99
+
100
+ This project uses `pyproject.toml` for dependency management and `uv` for package installation.
101
+
102
+ ### Development Dependencies
103
+
104
+ To install the package with development dependencies:
105
+
106
+ ```bash
107
+ uv add "veris-ai[dev]"
108
+ ```
109
+
110
+ This will install the following development tools:
111
+ - **Ruff**: Fast Python linter
112
+ - **pytest**: Testing framework
113
+ - **pytest-asyncio**: Async support for pytest
114
+ - **pytest-cov**: Coverage reporting for pytest
115
+ - **black**: Code formatter
116
+ - **mypy**: Static type checker
117
+ - **pre-commit**: Git hooks for code quality
118
+
119
+ ### Code Quality
120
+
121
+ This project uses [Ruff](https://github.com/charliermarsh/ruff) for linting and code quality checks. Ruff is a fast Python linter written in Rust.
122
+
123
+ To run Ruff:
124
+
125
+ ```bash
126
+ ruff check .
127
+ ```
128
+
129
+ To automatically fix issues:
130
+
131
+ ```bash
132
+ ruff check --fix .
133
+ ```
134
+
135
+ The Ruff configuration is defined in `pyproject.toml` under the `[tool.ruff]` section.
136
+
137
+ ## License
138
+
139
+ This project is licensed under the MIT License - see the LICENSE file for details.
@@ -0,0 +1,116 @@
1
+ # Veris AI Python SDK
2
+
3
+ A Python package for Veris AI tools with simulation capabilities.
4
+
5
+ ## Installation
6
+
7
+ You can install the package using `uv`:
8
+
9
+ ```bash
10
+ # Install the package
11
+ uv add veris-ai
12
+
13
+ # Install with development dependencies
14
+ uv add "veris-ai[dev]"
15
+ ```
16
+
17
+ ## Environment Setup
18
+
19
+ The package requires the following environment variables:
20
+
21
+ ```bash
22
+ # Required: URL for the mock endpoint
23
+ VERIS_MOCK_ENDPOINT_URL=http://your-mock-endpoint.com
24
+
25
+ # Optional: Timeout in seconds (default: 30.0)
26
+ VERIS_MOCK_TIMEOUT=30.0
27
+
28
+ # Optional: Set to "simulation" to enable mock mode
29
+ ENV=simulation
30
+ ```
31
+
32
+ ## Python Version
33
+
34
+ This project requires Python 3.11 or higher. We use [pyenv](https://github.com/pyenv/pyenv) for Python version management.
35
+
36
+ To set up the correct Python version:
37
+
38
+ ```bash
39
+ # Install Python 3.11.0 using pyenv
40
+ pyenv install 3.11.0
41
+
42
+ # Set the local Python version for this project
43
+ pyenv local 3.11.0
44
+ ```
45
+
46
+ ## Usage
47
+
48
+ ```python
49
+ from veris_ai import veris
50
+
51
+ @veris.mock()
52
+ async def your_function(param1: str, param2: int) -> dict:
53
+ """
54
+ Your function documentation here.
55
+
56
+ Args:
57
+ param1: Description of param1
58
+ param2: Description of param2
59
+
60
+ Returns:
61
+ A dictionary containing the results
62
+ """
63
+ # Your implementation here
64
+ return {"result": "actual implementation"}
65
+ ```
66
+
67
+ When `ENV=simulation` is set, the decorator will:
68
+ 1. Capture the function signature, type hints, and docstring
69
+ 2. Send this information to the mock endpoint
70
+ 3. Convert the mock response to the expected return type
71
+ 4. Return the mock result
72
+
73
+ When not in simulation mode, the original function will be executed normally.
74
+
75
+ ## Development
76
+
77
+ This project uses `pyproject.toml` for dependency management and `uv` for package installation.
78
+
79
+ ### Development Dependencies
80
+
81
+ To install the package with development dependencies:
82
+
83
+ ```bash
84
+ uv add "veris-ai[dev]"
85
+ ```
86
+
87
+ This will install the following development tools:
88
+ - **Ruff**: Fast Python linter
89
+ - **pytest**: Testing framework
90
+ - **pytest-asyncio**: Async support for pytest
91
+ - **pytest-cov**: Coverage reporting for pytest
92
+ - **black**: Code formatter
93
+ - **mypy**: Static type checker
94
+ - **pre-commit**: Git hooks for code quality
95
+
96
+ ### Code Quality
97
+
98
+ This project uses [Ruff](https://github.com/charliermarsh/ruff) for linting and code quality checks. Ruff is a fast Python linter written in Rust.
99
+
100
+ To run Ruff:
101
+
102
+ ```bash
103
+ ruff check .
104
+ ```
105
+
106
+ To automatically fix issues:
107
+
108
+ ```bash
109
+ ruff check --fix .
110
+ ```
111
+
112
+ The Ruff configuration is defined in `pyproject.toml` under the `[tool.ruff]` section.
113
+
114
+ ## License
115
+
116
+ This project is licensed under the MIT License - see the LICENSE file for details.
@@ -0,0 +1,100 @@
1
+ [build-system]
2
+ requires = ["hatchling"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "veris-ai"
7
+ version = "0.1.0"
8
+ description = "A Python package for Veris AI tools"
9
+ readme = "README.md"
10
+ requires-python = ">=3.11"
11
+ license = "MIT"
12
+ authors = [
13
+ { name = "Mehdi Jamei", email = "mehdi@veris.ai" }
14
+ ]
15
+ dependencies = [
16
+ "typing-extensions>=4.0.0",
17
+ "httpx>=0.24.0",
18
+ "python-dotenv>=1.0.0",
19
+ ]
20
+
21
+ [project.optional-dependencies]
22
+ dev = [
23
+ "ruff>=0.11.4",
24
+ "pytest>=7.4.0",
25
+ "pytest-asyncio>=0.21.1",
26
+ "pytest-cov>=4.1.0",
27
+ "black>=23.7.0",
28
+ "mypy>=1.5.1",
29
+ "pre-commit>=3.3.3",
30
+ ]
31
+
32
+ [project.urls]
33
+ "Homepage" = "https://github.com/veris-ai/veris-python-sdk"
34
+ "Bug Tracker" = "https://github.com/veris-ai/veris-python-sdk/issues"
35
+
36
+ [tool.hatch.build.targets.wheel]
37
+ packages = ["src/veris_ai"]
38
+
39
+ [tool.pytest.ini_options]
40
+ testpaths = ["tests"]
41
+ python_files = ["test_*.py"]
42
+
43
+ [tool.ruff]
44
+ line-length = 100
45
+ target-version = "py311"
46
+ select = [
47
+ "E", # pycodestyle errors
48
+ "F", # pyflakes
49
+ "I", # isort
50
+ "B", # flake8-bugbear
51
+ "C4", # flake8-comprehensions
52
+ "UP", # pyupgrade
53
+ "N", # pep8-naming
54
+ "ANN", # flake8-annotations
55
+ "S", # flake8-bandit
56
+ "A", # flake8-builtins
57
+ "COM", # flake8-commas
58
+ "C90", # mccabe complexity
59
+ "D", # pydocstyle
60
+ "T10", # flake8-debugger
61
+ "EM", # flake8-errmsg
62
+ "EXE", # flake8-executable
63
+ "ISC", # flake8-implicit-str-concat
64
+ "INP", # flake8-no-pep420
65
+ "PIE", # flake8-pie
66
+ "T20", # flake8-print
67
+ "PYI", # flake8-pyi
68
+ "PT", # flake8-pytest-style
69
+ "Q", # flake8-quotes
70
+ "RSE", # flake8-raise
71
+ "RET", # flake8-return
72
+ "SLF", # flake8-self
73
+ "SIM", # flake8-simplify
74
+ "TID", # flake8-tidy-imports
75
+ "TCH", # flake8-type-checking
76
+ "ARG", # flake8-unused-arguments
77
+ "PTH", # flake8-use-pathlib
78
+ "ERA", # eradicate
79
+ "PD", # pandas-vet
80
+ "PGH", # pygrep-hooks
81
+ "PL", # pylint
82
+ ]
83
+ ignore = [
84
+ "D100", # Missing docstring in public module
85
+ "D104", # Missing docstring in public package
86
+ "D107", # Missing docstring in __init__
87
+ "ANN101", # Missing type annotation for self
88
+ "ANN102", # Missing type annotation for cls
89
+ "ANN204", # Missing type annotation for *args
90
+ "ANN205", # Missing type annotation for **kwargs
91
+ ]
92
+
93
+ [tool.ruff.isort]
94
+ known-first-party = ["veris_ai"]
95
+
96
+ [tool.ruff.pydocstyle]
97
+ convention = "google"
98
+
99
+ [tool.ruff.per-file-ignores]
100
+ "tests/*" = ["S101", "D103", "ANN401"]
@@ -0,0 +1,7 @@
1
+ """Veris AI Python SDK."""
2
+
3
+ __version__ = "0.1.0"
4
+
5
+ from .tool_mock import veris
6
+
7
+ __all__ = ["veris"]
@@ -0,0 +1,128 @@
1
+ import inspect
2
+ import json
3
+ import logging
4
+ import os
5
+ from collections.abc import Callable
6
+ from functools import wraps
7
+ from typing import Any, Union, get_type_hints
8
+
9
+ import httpx
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+ class ToolMock:
14
+ """Class for mocking tool calls."""
15
+ def __init__(self):
16
+ self.endpoint = os.getenv("VERIS_MOCK_ENDPOINT_URL")
17
+ if not self.endpoint:
18
+ raise ValueError("VERIS_MOCK_ENDPOINT_URL environment variable is not set")
19
+ # Default timeout of 30 seconds
20
+ self.timeout = float(os.getenv("VERIS_MOCK_TIMEOUT", "30.0"))
21
+
22
+ def _convert_to_type(self, value: Any, target_type: type) -> Any: # type: ignore
23
+ """Convert a value to the specified type."""
24
+ if target_type == Any:
25
+ return value
26
+
27
+ # Handle basic types
28
+ if target_type in (str, int, float, bool):
29
+ return target_type(value)
30
+
31
+ # Handle List types
32
+ if hasattr(target_type, "__origin__") and target_type.__origin__ == list:
33
+ if not isinstance(value, list):
34
+ raise ValueError(f"Expected list but got {type(value)}")
35
+ item_type = target_type.__args__[0]
36
+ return [self._convert_to_type(item, item_type) for item in value]
37
+
38
+ # Handle Dict types
39
+ if hasattr(target_type, "__origin__") and target_type.__origin__ == dict:
40
+ if not isinstance(value, dict):
41
+ raise ValueError(f"Expected dict but got {type(value)}")
42
+ key_type, value_type = target_type.__args__
43
+ return {self._convert_to_type(k, key_type): self._convert_to_type(v, value_type)
44
+ for k, v in value.items()}
45
+
46
+ # Handle Union types
47
+ if hasattr(target_type, "__origin__") and target_type.__origin__ == Union:
48
+ for possible_type in target_type.__args__:
49
+ try:
50
+ return self._convert_to_type(value, possible_type)
51
+ except (ValueError, TypeError):
52
+ continue
53
+ raise ValueError(f"Could not convert {value} to any of the union types {target_type.__args__}") # noqa
54
+
55
+ # For other types, try direct conversion
56
+ return target_type(value)
57
+
58
+ def mock(self, func: Callable) -> Callable:
59
+ """Decorator for mocking tool calls."""
60
+ @wraps(func)
61
+ async def wrapper(*args, **kwargs):
62
+ # Check if we're in simulation mode
63
+ env_mode = os.getenv("ENV", "").lower()
64
+ if env_mode != "simulation":
65
+ # If not in simulation mode, execute the original function
66
+ return await func(*args, **kwargs)
67
+
68
+ logger.info(f"Simulating function: {func.__name__}")
69
+ sig = inspect.signature(func)
70
+ type_hints = get_type_hints(func)
71
+
72
+ # Extract return type object (not just the name)
73
+ return_type_obj = type_hints.pop("return", Any)
74
+
75
+ # Create parameter info
76
+ params_info = {}
77
+ bound_args = sig.bind(*args, **kwargs)
78
+ bound_args.apply_defaults()
79
+
80
+ for param_name, param_value in bound_args.arguments.items():
81
+ params_info[param_name] = {
82
+ "value": param_value,
83
+ "type": type_hints.get(param_name, Any).__name__,
84
+ }
85
+
86
+ # Get function docstring
87
+ docstring = inspect.getdoc(func) or ""
88
+
89
+ ctx = bound_args.arguments.pop('ctx', None)
90
+ session_id = None
91
+ if ctx:
92
+ try:
93
+ session_id = ctx.request_context.lifespan_context.session_id
94
+ except AttributeError:
95
+ logger.warning("Cannot get session_id from context.")
96
+
97
+ # Prepare payload
98
+ payload = {
99
+ "session_id": session_id,
100
+ "tool_call": {
101
+ 'function_name': func.__name__,
102
+ 'parameters': params_info,
103
+ 'return_type': return_type_obj.__name__,
104
+ 'docstring': docstring,
105
+ }
106
+ }
107
+
108
+ # Send request to endpoint with timeout
109
+ async with httpx.AsyncClient(timeout=self.timeout) as client:
110
+ response = await client.post(self.endpoint, json=payload)
111
+ response.raise_for_status()
112
+ mock_result = response.json()["result"]
113
+ logger.info(f"Mock response: {mock_result}")
114
+
115
+ # Parse the mock result if it's a string
116
+ if isinstance(mock_result, str):
117
+ try:
118
+ mock_result = json.loads(mock_result)
119
+ except json.JSONDecodeError:
120
+ # If it's not valid JSON, treat it as a raw string
121
+ pass
122
+
123
+ # Convert the mock result to the expected return type
124
+ return self._convert_to_type(mock_result, return_type_obj)
125
+
126
+ return wrapper
127
+
128
+ veris = ToolMock()
veris_ai-0.1.0/uv.lock ADDED
@@ -0,0 +1,142 @@
1
+ version = 1
2
+ revision = 1
3
+ requires-python = ">=3.11"
4
+
5
+ [[package]]
6
+ name = "anyio"
7
+ version = "4.5.2"
8
+ source = { registry = "https://pypi.org/simple" }
9
+ dependencies = [
10
+ { name = "idna" },
11
+ { name = "sniffio" },
12
+ ]
13
+ sdist = { url = "https://files.pythonhosted.org/packages/4d/f9/9a7ce600ebe7804daf90d4d48b1c0510a4561ddce43a596be46676f82343/anyio-4.5.2.tar.gz", hash = "sha256:23009af4ed04ce05991845451e11ef02fc7c5ed29179ac9a420e5ad0ac7ddc5b", size = 171293 }
14
+ wheels = [
15
+ { url = "https://files.pythonhosted.org/packages/1b/b4/f7e396030e3b11394436358ca258a81d6010106582422f23443c16ca1873/anyio-4.5.2-py3-none-any.whl", hash = "sha256:c011ee36bc1e8ba40e5a81cb9df91925c218fe9b778554e0b56a21e1b5d4716f", size = 89766 },
16
+ ]
17
+
18
+ [[package]]
19
+ name = "certifi"
20
+ version = "2025.1.31"
21
+ source = { registry = "https://pypi.org/simple" }
22
+ sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577 }
23
+ wheels = [
24
+ { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 },
25
+ ]
26
+
27
+ [[package]]
28
+ name = "h11"
29
+ version = "0.14.0"
30
+ source = { registry = "https://pypi.org/simple" }
31
+ sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 }
32
+ wheels = [
33
+ { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 },
34
+ ]
35
+
36
+ [[package]]
37
+ name = "httpcore"
38
+ version = "1.0.7"
39
+ source = { registry = "https://pypi.org/simple" }
40
+ dependencies = [
41
+ { name = "certifi" },
42
+ { name = "h11" },
43
+ ]
44
+ sdist = { url = "https://files.pythonhosted.org/packages/6a/41/d7d0a89eb493922c37d343b607bc1b5da7f5be7e383740b4753ad8943e90/httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c", size = 85196 }
45
+ wheels = [
46
+ { url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd", size = 78551 },
47
+ ]
48
+
49
+ [[package]]
50
+ name = "httpx"
51
+ version = "0.28.1"
52
+ source = { registry = "https://pypi.org/simple" }
53
+ dependencies = [
54
+ { name = "anyio" },
55
+ { name = "certifi" },
56
+ { name = "httpcore" },
57
+ { name = "idna" },
58
+ ]
59
+ sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 }
60
+ wheels = [
61
+ { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 },
62
+ ]
63
+
64
+ [[package]]
65
+ name = "idna"
66
+ version = "3.10"
67
+ source = { registry = "https://pypi.org/simple" }
68
+ sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 }
69
+ wheels = [
70
+ { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 },
71
+ ]
72
+
73
+ [[package]]
74
+ name = "python-dotenv"
75
+ version = "1.0.1"
76
+ source = { registry = "https://pypi.org/simple" }
77
+ sdist = { url = "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", size = 39115 }
78
+ wheels = [
79
+ { url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863 },
80
+ ]
81
+
82
+ [[package]]
83
+ name = "ruff"
84
+ version = "0.11.4"
85
+ source = { registry = "https://pypi.org/simple" }
86
+ sdist = { url = "https://files.pythonhosted.org/packages/e8/5b/3ae20f89777115944e89c2d8c2e795dcc5b9e04052f76d5347e35e0da66e/ruff-0.11.4.tar.gz", hash = "sha256:f45bd2fb1a56a5a85fae3b95add03fb185a0b30cf47f5edc92aa0355ca1d7407", size = 3933063 }
87
+ wheels = [
88
+ { url = "https://files.pythonhosted.org/packages/9c/db/baee59ac88f57527fcbaad3a7b309994e42329c6bc4d4d2b681a3d7b5426/ruff-0.11.4-py3-none-linux_armv6l.whl", hash = "sha256:d9f4a761ecbde448a2d3e12fb398647c7f0bf526dbc354a643ec505965824ed2", size = 10106493 },
89
+ { url = "https://files.pythonhosted.org/packages/c1/d6/9a0962cbb347f4ff98b33d699bf1193ff04ca93bed4b4222fd881b502154/ruff-0.11.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:8c1747d903447d45ca3d40c794d1a56458c51e5cc1bc77b7b64bd2cf0b1626cc", size = 10876382 },
90
+ { url = "https://files.pythonhosted.org/packages/3a/8f/62bab0c7d7e1ae3707b69b157701b41c1ccab8f83e8501734d12ea8a839f/ruff-0.11.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:51a6494209cacca79e121e9b244dc30d3414dac8cc5afb93f852173a2ecfc906", size = 10237050 },
91
+ { url = "https://files.pythonhosted.org/packages/09/96/e296965ae9705af19c265d4d441958ed65c0c58fc4ec340c27cc9d2a1f5b/ruff-0.11.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f171605f65f4fc49c87f41b456e882cd0c89e4ac9d58e149a2b07930e1d466f", size = 10424984 },
92
+ { url = "https://files.pythonhosted.org/packages/e5/56/644595eb57d855afed6e54b852e2df8cd5ca94c78043b2f29bdfb29882d5/ruff-0.11.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ebf99ea9af918878e6ce42098981fc8c1db3850fef2f1ada69fb1dcdb0f8e79e", size = 9957438 },
93
+ { url = "https://files.pythonhosted.org/packages/86/83/9d3f3bed0118aef3e871ded9e5687fb8c5776bde233427fd9ce0a45db2d4/ruff-0.11.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edad2eac42279df12e176564a23fc6f4aaeeb09abba840627780b1bb11a9d223", size = 11547282 },
94
+ { url = "https://files.pythonhosted.org/packages/40/e6/0c6e4f5ae72fac5ccb44d72c0111f294a5c2c8cc5024afcb38e6bda5f4b3/ruff-0.11.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f103a848be9ff379fc19b5d656c1f911d0a0b4e3e0424f9532ececf319a4296e", size = 12182020 },
95
+ { url = "https://files.pythonhosted.org/packages/b5/92/4aed0e460aeb1df5ea0c2fbe8d04f9725cccdb25d8da09a0d3f5b8764bf8/ruff-0.11.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:193e6fac6eb60cc97b9f728e953c21cc38a20077ed64f912e9d62b97487f3f2d", size = 11679154 },
96
+ { url = "https://files.pythonhosted.org/packages/1b/d3/7316aa2609f2c592038e2543483eafbc62a0e1a6a6965178e284808c095c/ruff-0.11.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7af4e5f69b7c138be8dcffa5b4a061bf6ba6a3301f632a6bce25d45daff9bc99", size = 13905985 },
97
+ { url = "https://files.pythonhosted.org/packages/63/80/734d3d17546e47ff99871f44ea7540ad2bbd7a480ed197fe8a1c8a261075/ruff-0.11.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:126b1bf13154aa18ae2d6c3c5efe144ec14b97c60844cfa6eb960c2a05188222", size = 11348343 },
98
+ { url = "https://files.pythonhosted.org/packages/04/7b/70fc7f09a0161dce9613a4671d198f609e653d6f4ff9eee14d64c4c240fb/ruff-0.11.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e8806daaf9dfa881a0ed603f8a0e364e4f11b6ed461b56cae2b1c0cab0645304", size = 10308487 },
99
+ { url = "https://files.pythonhosted.org/packages/1a/22/1cdd62dabd678d75842bf4944fd889cf794dc9e58c18cc547f9eb28f95ed/ruff-0.11.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:5d94bb1cc2fc94a769b0eb975344f1b1f3d294da1da9ddbb5a77665feb3a3019", size = 9929091 },
100
+ { url = "https://files.pythonhosted.org/packages/9f/20/40e0563506332313148e783bbc1e4276d657962cc370657b2fff20e6e058/ruff-0.11.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:995071203d0fe2183fc7a268766fd7603afb9996785f086b0d76edee8755c896", size = 10924659 },
101
+ { url = "https://files.pythonhosted.org/packages/b5/41/eef9b7aac8819d9e942f617f9db296f13d2c4576806d604aba8db5a753f1/ruff-0.11.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:7a37ca937e307ea18156e775a6ac6e02f34b99e8c23fe63c1996185a4efe0751", size = 11428160 },
102
+ { url = "https://files.pythonhosted.org/packages/ff/61/c488943414fb2b8754c02f3879de003e26efdd20f38167ded3fb3fc1cda3/ruff-0.11.4-py3-none-win32.whl", hash = "sha256:0e9365a7dff9b93af933dab8aebce53b72d8f815e131796268709890b4a83270", size = 10311496 },
103
+ { url = "https://files.pythonhosted.org/packages/b6/2b/2a1c8deb5f5dfa3871eb7daa41492c4d2b2824a74d2b38e788617612a66d/ruff-0.11.4-py3-none-win_amd64.whl", hash = "sha256:5a9fa1c69c7815e39fcfb3646bbfd7f528fa8e2d4bebdcf4c2bd0fa037a255fb", size = 11399146 },
104
+ { url = "https://files.pythonhosted.org/packages/4f/03/3aec4846226d54a37822e4c7ea39489e4abd6f88388fba74e3d4abe77300/ruff-0.11.4-py3-none-win_arm64.whl", hash = "sha256:d435db6b9b93d02934cf61ef332e66af82da6d8c69aefdea5994c89997c7a0fc", size = 10450306 },
105
+ ]
106
+
107
+ [[package]]
108
+ name = "sniffio"
109
+ version = "1.3.1"
110
+ source = { registry = "https://pypi.org/simple" }
111
+ sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 }
112
+ wheels = [
113
+ { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 },
114
+ ]
115
+
116
+ [[package]]
117
+ name = "typing-extensions"
118
+ version = "4.13.1"
119
+ source = { registry = "https://pypi.org/simple" }
120
+ sdist = { url = "https://files.pythonhosted.org/packages/76/ad/cd3e3465232ec2416ae9b983f27b9e94dc8171d56ac99b345319a9475967/typing_extensions-4.13.1.tar.gz", hash = "sha256:98795af00fb9640edec5b8e31fc647597b4691f099ad75f469a2616be1a76dff", size = 106633 }
121
+ wheels = [
122
+ { url = "https://files.pythonhosted.org/packages/df/c5/e7a0b0f5ed69f94c8ab7379c599e6036886bffcde609969a5325f47f1332/typing_extensions-4.13.1-py3-none-any.whl", hash = "sha256:4b6cf02909eb5495cfbc3f6e8fd49217e6cc7944e145cdda8caa3734777f9e69", size = 45739 },
123
+ ]
124
+
125
+ [[package]]
126
+ name = "veris-ai"
127
+ version = "0.1.0"
128
+ source = { editable = "." }
129
+ dependencies = [
130
+ { name = "httpx" },
131
+ { name = "python-dotenv" },
132
+ { name = "ruff" },
133
+ { name = "typing-extensions" },
134
+ ]
135
+
136
+ [package.metadata]
137
+ requires-dist = [
138
+ { name = "httpx", specifier = ">=0.24.0" },
139
+ { name = "python-dotenv", specifier = ">=1.0.0" },
140
+ { name = "ruff", specifier = ">=0.11.4" },
141
+ { name = "typing-extensions", specifier = ">=4.0.0" },
142
+ ]