[build-system] requires = ["setuptools>=64", "wheel"] build-backend = "setuptools.build_meta" [project] name = "rllm" version = "0.3.0.pre" description = "Reinforcement Learning for Language Agents" authors = [ {name = "rLLM Team"} ] readme = "README.md" requires-python = ">=3.10" classifiers = [ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", ] license = {file = "LICENSE"} dependencies = [ "rllm-model-gateway", # CLI "click>=8.0", "rich>=13.9.4", "simple-term-menu>=1.6", # Core "pydantic", "PyYAML", "openai", "tqdm", "requests", # Data "datasets>=2.20.0", "pillow", "pandas", "polars", "pyarrow", "litellm[proxy]>=1.83.0", "aiosqlite", "hydra-core", "codetiming", "tinker>=0.22.2 ; python_version >= '3.11'", "tinker-cookbook>=0.4.1 ; python_version >= '3.11'", ] [project.scripts] rllm = "rllm.cli.main:cli" [project.optional-dependencies] rewards = [ "sympy", "pylatexenc", "antlr4-python3-runtime==4.9.3", ] tools = [ "mcp", ] all = [ "rllm[train,rewards,tools]", ] ui = [ "httpx>=0.26.0", "python-multipart>=0.0.6", ] dev = [ "pytest", "pre-commit", "ruff", "mypy", ] verl = [ "transformers>=5.5.3", "numpy", "verl==0.8.0", "ray", "torch>=2.10.0", "torchvision>=0.23.0", "vllm==0.22.1", "flash-attn==2.8.3", "qwen-vl-utils", ] tinker = [ "tinker>=0.22.2 ; python_version >= '3.11'", "tinker-cookbook>=0.4.1 ; python_version >= '3.11'", ] fireworks = [ "fireworks-ai[training]==1.2.20 ; python_version >= '3.11'", "fireworks-training-cookbook @ git+https://github.com/fw-ai/cookbook.git@bba676c6d00bd595f9453e0b2165b7457a01e0d5#subdirectory=training ; python_version >= '3.11'", ] opentelemetry = [ "opentelemetry-sdk", ] smolagents = [ "smolagents==1.20.0", ] strands = [ "strands-agents", ] langgraph = [ "langgraph>=0.2.0", "langchain-openai>=0.2.0", ] swe = [ "docker", "kubernetes", "swebench", ] web = [ "selenium", "firecrawl", "gymnasium", ] agentcore = [ "agentcore-rl-toolkit>=0.1.2", ] code-tools = [ "e2b_code_interpreter", "together>=1.4", ] harbor = [ "harbor==0.3.0 ; python_version >= '3.12'", ] [tool.uv.sources] rllm-model-gateway = { path = "./rllm-model-gateway", editable = true } [tool.uv] override-dependencies = [ "litellm[proxy]==1.83.0", "numpy>=1.26.0", "rich>=14.1.0", ] [tool.uv.extra-build-dependencies] flash-attn = [ { requirement = "torch", match-runtime = true }, ] [tool.ruff] line-length = 200 # slightly conservative value, turn this on later. [tool.ruff.lint] isort = {known-first-party = ["rllm"], known-third-party = ["verl"]} # c.f. https://github.com/vllm-project/vllm/blob/ce8d6b75fc0586045df75ee1568a5b5f9957251b/pyproject.toml select = [ # pycodestyle "E", # Pyflakes "F", # pyupgrade "UP", # flake8-bugbear "B", # isort "I", "G", ] ignore = [ # star imports "F405", "F403", # lambda expression assignment "E731", # Loop control variable not used within loop body "B007", # f-string format "UP032", # `.log()` statement uses f-string "G004", # equality check using x == True "E712", ] [tool.ruff.lint.per-file-ignores] "rllm/rewards/code_utils/**" = ["ALL"] # Prompt / string-heavy files where long lines are intentional "rllm/agents/system_prompts.py" = ["E501"] "rllm/system_prompts.py" = ["E501"] "rllm/agents/code_agent.py" = ["E501"] "examples/archive/deepresearch/deepresearch_agent.py" = ["E501"] "examples/fully_async/deepresearch/refine_agent.py" = ["E501"] "examples/fully_async/deepresearch/search_agent.py" = ["E501"] "examples/countdown/prepare_countdown_data.py" = ["E501"] "cookbooks/solver_judge_flow/solver_judge_flow.py" = ["E501"] "rllm/cli/main.py" = ["E501"] "rllm/eval/visualizer.py" = ["E501"] "rllm/experimental/rllm_telemetry/examples/experiment_comparison.py" = ["E501"] "rllm/harnesses/tools/file_editor_tool.py" = ["E501"] "rllm/rewards/math_reward.py" = ["E501"] "tests/integration/test_agentcore_runtime.py" = ["E501"] "tests/integration/test_remote_engine.py" = ["E501"] "tests/rewards/test_code_reward.py" = ["E501"] [tool.setuptools.packages.find] where = ["."] include = ["rllm", "rllm.*"] [tool.setuptools.package-data] rllm = ["trainer/**/config/**/*.yaml", "registry/*.json"] [tool.mypy] plugins = ["pydantic.mypy"] ignore_missing_imports = true check_untyped_defs = true follow_imports = "silent" exclude = [ "verl/.*", "rllm/rewards/code_utils/.*", "rllm/rewards/math_utils/.*", "examples/.*", "scripts/.*", "tests/.*", "docs/.*", ]