[build-system] requires = ["setuptools>=68.0", "wheel"] build-backend = "setuptools.build_meta" [project] name = "ifixai" version = "3.4.1" description = "ifixai — open-source diagnostic for AI misalignment" readme = "README.md" license = {text = "Apache-2.0"} requires-python = ">=3.10" authors = [ {name = "ifixai Contributors"}, ] keywords = ["ai", "governance", "safety", "compliance", "tests", "misalignment"] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Topic :: Scientific/Engineering :: Artificial Intelligence", "Topic :: Software Development :: Testing", "Typing :: Typed", ] dependencies = [ "pydantic>=2.0", "typing_extensions>=4.6", "pyyaml>=6.0", "jsonschema>=4.0", "click>=8.0", "aiohttp>=3.9", "python-dateutil>=2.8.2", "json-repair>=0.25", "rich>=13.0", "questionary>=2.0", ] [project.optional-dependencies] openai = ["openai>=1.0"] atlascloud = ["openai>=1.0"] openrouter = ["openai>=1.0"] orcarouter = ["openai>=1.0"] gemini = ["google-generativeai>=0.3"] anthropic = ["anthropic>=0.18"] azure = ["openai>=1.0"] bedrock = ["boto3>=1.28"] huggingface = ["huggingface-hub>=0.20"] litellm = ["litellm>=1.60.0,<2.0.0"] all = [ "openai>=1.0", "google-generativeai>=0.3", "anthropic>=0.18", "boto3>=1.28", "huggingface-hub>=0.20", "litellm>=1.60.0,<2.0.0", ] dev = [ "ruff>=0.4", "mypy>=1.0", "bandit>=1.7", "pre-commit>=3.5", "openai>=1.0", "pytest>=8.0", "pytest-asyncio>=0.23", "pytest-cov>=5.0", ] [project.scripts] ifixai = "ifixai.cli.main:main" [project.urls] Homepage = "https://github.com/ifixai-ai/iFixAi" Documentation = "https://github.com/ifixai-ai/iFixAi#readme" Repository = "https://github.com/ifixai-ai/iFixAi" Issues = "https://github.com/ifixai-ai/iFixAi/issues" [tool.pytest.ini_options] asyncio_mode = "auto" markers = [ "integration: end-to-end tests that run against the mock provider", "unit: fast in-process tests with no external dependencies", "acceptance: slow tests requiring optional heavy dependencies; opt-in via -m acceptance", ] [tool.setuptools.packages.find] include = ["ifixai*"] [tool.setuptools.package-data] ifixai = ["py.typed", "fixtures/**/*.yaml", "fixtures/**/*.json", "fixtures/schema.json", "inspections/[bpcsxm]*/*.yaml", "schemas/*.json", "harness/synonyms.yaml", "judge/judge_fallbacks.json", "mappings/*.yaml", "scaffold/*.md"] [tool.ruff.lint] select = ["E4", "E7", "E9", "F", "I", "UP", "RUF", "TRY", "BLE"] ignore = [ "TRY003", # long messages outside the exception class; pervasive and low-value here "RUF001", # ambiguous unicode in strings (intentional in fixture/report copy) "RUF002", # ambiguous unicode in docstrings "RUF003", # ambiguous unicode in comments "UP045", # Optional[x] -> x | None; large mechanical churn, deferred ] [tool.ruff.lint.per-file-ignores] # ChatProvider base-class methods accept the full provider-call signature as an # interface contract; concrete subclasses use the args, the no-op defaults do not. "ifixai/providers/base.py" = ["ARG002"]