diff --git a/requirements.txt b/requirements.txt index 4381c204..0227161b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ Pillow>=12.0.0 -openai>=2.9.0 +openai>=2.6.1 # For iOS Support requests>=2.31.0 diff --git a/setup.py b/setup.py index b35c2b19..fcdf499a 100644 --- a/setup.py +++ b/setup.py @@ -31,7 +31,7 @@ python_requires=">=3.10", install_requires=[ "Pillow>=12.0.0", - "openai>=2.9.0", + "openai>=2.6.1", ], extras_require={ "dev": [ diff --git a/tests/test_dependency_constraints.py b/tests/test_dependency_constraints.py new file mode 100644 index 00000000..78d2acac --- /dev/null +++ b/tests/test_dependency_constraints.py @@ -0,0 +1,36 @@ +import ast +from pathlib import Path + +from packaging.requirements import Requirement +from packaging.version import Version + +PROJECT_ROOT = Path(__file__).resolve().parents[1] +SGLANG_PINNED_OPENAI_VERSION = Version("2.6.1") + + +def _openai_requirement_from_requirements_txt() -> Requirement: + requirements_path = PROJECT_ROOT / "requirements.txt" + for line in requirements_path.read_text(encoding="utf-8").splitlines(): + stripped = line.strip() + if stripped.startswith("openai"): + return Requirement(stripped) + raise AssertionError("requirements.txt does not declare openai") + + +def _openai_requirement_from_setup_py() -> Requirement: + setup_tree = ast.parse((PROJECT_ROOT / "setup.py").read_text(encoding="utf-8")) + for node in ast.walk(setup_tree): + if isinstance(node, ast.keyword) and node.arg == "install_requires": + requirements = ast.literal_eval(node.value) + for requirement in requirements: + if requirement.startswith("openai"): + return Requirement(requirement) + raise AssertionError("setup.py does not declare openai") + + +def test_openai_dependency_allows_sglang_pinned_version() -> None: + for requirement in ( + _openai_requirement_from_requirements_txt(), + _openai_requirement_from_setup_py(), + ): + assert SGLANG_PINNED_OPENAI_VERSION in requirement.specifier