From 86152f6b1b4c27259b2c50e75013a8290df0cc43 Mon Sep 17 00:00:00 2001 From: openhands Date: Mon, 7 Jul 2025 18:52:30 +0000 Subject: [PATCH 1/2] Set up repository structure following Sotopia --- .github/pull_request_template.md | 28 +++++++ .github/workflows/lint.yml | 28 +++++++ .github/workflows/tests.yml | 29 +++++++ .pre-commit-config.yaml | 21 +++++ README.md | 46 ++++++++++- examples/basic_verification.py | 40 ++++++++++ pyproject.toml | 47 ++++++++++++ sotopia_verifiable/__init__.py | 7 ++ sotopia_verifiable/cli/__init__.py | 5 ++ sotopia_verifiable/cli/app.py | 89 ++++++++++++++++++++++ sotopia_verifiable/core/__init__.py | 5 ++ sotopia_verifiable/core/verifiable_game.py | 62 +++++++++++++++ tests/__init__.py | 1 + tests/test_cli.py | 41 ++++++++++ tests/test_verifiable_game.py | 43 +++++++++++ 15 files changed, 490 insertions(+), 2 deletions(-) create mode 100644 .github/pull_request_template.md create mode 100644 .github/workflows/lint.yml create mode 100644 .github/workflows/tests.yml create mode 100644 .pre-commit-config.yaml create mode 100644 examples/basic_verification.py create mode 100644 pyproject.toml create mode 100644 sotopia_verifiable/__init__.py create mode 100644 sotopia_verifiable/cli/__init__.py create mode 100644 sotopia_verifiable/cli/app.py create mode 100644 sotopia_verifiable/core/__init__.py create mode 100644 sotopia_verifiable/core/verifiable_game.py create mode 100644 tests/__init__.py create mode 100644 tests/test_cli.py create mode 100644 tests/test_verifiable_game.py diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..1e9932c --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,28 @@ +## Description + +Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. + +Fixes # (issue) + +## Type of change + +Please delete options that are not relevant. + +- [ ] Bug fix (non-breaking change which fixes an issue) +- [ ] New feature (non-breaking change which adds functionality) +- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) +- [ ] Documentation update + +## How Has This Been Tested? + +Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. + +## Checklist: + +- [ ] My code follows the style guidelines of this project +- [ ] I have performed a self-review of my own code +- [ ] I have commented my code, particularly in hard-to-understand areas +- [ ] I have made corresponding changes to the documentation +- [ ] My changes generate no new warnings +- [ ] I have added tests that prove my fix is effective or that my feature works +- [ ] New and existing unit tests pass locally with my changes \ No newline at end of file diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..2bc0b64 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,28 @@ +name: Lint + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.10" + - name: Install dependencies + run: | + python -m pip install --upgrade pip + python -m pip install ruff mypy + python -m pip install -e ".[test]" + - name: Lint with ruff + run: | + ruff check . + - name: Type check with mypy + run: | + mypy sotopia_verifiable \ No newline at end of file diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..f58096f --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,29 @@ +name: Tests + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + test: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.10", "3.11", "3.12"] + + steps: + - uses: actions/checkout@v4 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + python -m pip install pytest pytest-cov + python -m pip install -e ".[test]" + - name: Test with pytest + run: | + pytest --cov=sotopia_verifiable tests/ \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..0f68e41 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,21 @@ +repos: +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.5.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml + - id: check-added-large-files + +- repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.3.0 + hooks: + - id: ruff + args: [--fix, --exit-non-zero-on-fix] + - id: ruff-format + +- repo: https://github.com/pre-commit/mirrors-mypy + rev: v1.8.0 + hooks: + - id: mypy + additional_dependencies: [pydantic] \ No newline at end of file diff --git a/README.md b/README.md index 42c82af..dd95a4c 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,44 @@ -# sotopia-verifiable -A collection of verifiable games in sotopia format +# Sotopia Verifiable + +A collection of verifiable games in Sotopia format. This extension provides tools and utilities for creating and evaluating verifiable social interactions within the Sotopia platform. + +## Installation + +```bash +pip install sotopia-verifiable +``` + +## Usage + +```python +import sotopia +from sotopia_verifiable import VerifiableGame + +# Example code will be added here +``` + +## Features + +- Verifiable game mechanics +- Integration with Sotopia platform +- Tools for evaluation and analysis + +## Development + +To set up the development environment: + +```bash +# Clone the repository +git clone https://github.com/sotopia-lab/sotopia-verifiable.git +cd sotopia-verifiable + +# Install dependencies +pip install -e ".[test]" + +# Run tests +pytest +``` + +## License + +MIT License diff --git a/examples/basic_verification.py b/examples/basic_verification.py new file mode 100644 index 0000000..677a534 --- /dev/null +++ b/examples/basic_verification.py @@ -0,0 +1,40 @@ +"""Basic example of using Sotopia Verifiable.""" + +from sotopia_verifiable import VerifiableGame + +# Create a game configuration +game_config = { + "name": "Simple Verification Example", + "verification_rules": [ + {"type": "score_threshold", "min_score": 0.7} + ] +} + +# Create a verifiable game +game = VerifiableGame(game_config) + +# Add another verification rule +game.add_verification_rule({"type": "time_limit", "max_seconds": 300}) + +# Print the verification rules +print("Verification Rules:") +for i, rule in enumerate(game.get_verification_rules(), 1): + print(f"Rule {i}: {rule}") + +# Simulate a game outcome +game_outcome = { + "score": 0.85, + "time_taken": 250 +} + +# Verify the outcome +result = game.verify(game_outcome) + +# Print the verification result +print("\nVerification Result:") +print(f"Valid: {result.is_valid}") +print(f"Score: {result.score}") +print(f"Details: {result.details}") + +# Note: The base implementation always returns valid=True +# Custom implementations would check against the actual rules \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..b97d578 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,47 @@ +[project] +name = "sotopia-verifiable" +version = "0.1.0" +description = "A verifiable extension for Sotopia platform." +authors = [ + { name = "Xuhui Zhou", email = "xuhuiz@cs.cmu.edu" } +] +requires-python = ">=3.10, <3.13" +license = { text = "MIT License" } +readme = "README.md" + +dependencies = [ + "sotopia>=0.1.4", + "pydantic>=2.5.0,<3.0.0", + "rich>=13.6.0,<15.0.0", + "absl-py>=2.0.0,<3.0.0" +] + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[project.optional-dependencies] +test = ["pytest", "pytest-cov", "pytest-asyncio"] + +[tool.uv] +dev-dependencies = [ + "pre-commit", + "types-setuptools", + "types-requests", + "ruff", + "mypy" +] + +[tool.mypy] +mypy_path = "stubs" +strict = true +plugins = [ + "pydantic.mypy" +] + +[tool.pytest.ini_options] +testpaths = ["tests"] +python_files = "test_*.py" + +[project.scripts] +sotopia-verifiable = "sotopia_verifiable.cli:app" \ No newline at end of file diff --git a/sotopia_verifiable/__init__.py b/sotopia_verifiable/__init__.py new file mode 100644 index 0000000..281106e --- /dev/null +++ b/sotopia_verifiable/__init__.py @@ -0,0 +1,7 @@ +"""Sotopia Verifiable - A collection of verifiable games in Sotopia format.""" + +__version__ = "0.1.0" + +from sotopia_verifiable.core.verifiable_game import VerifiableGame + +__all__ = ["VerifiableGame"] \ No newline at end of file diff --git a/sotopia_verifiable/cli/__init__.py b/sotopia_verifiable/cli/__init__.py new file mode 100644 index 0000000..2c63469 --- /dev/null +++ b/sotopia_verifiable/cli/__init__.py @@ -0,0 +1,5 @@ +"""CLI tools for Sotopia Verifiable.""" + +from sotopia_verifiable.cli.app import app + +__all__ = ["app"] \ No newline at end of file diff --git a/sotopia_verifiable/cli/app.py b/sotopia_verifiable/cli/app.py new file mode 100644 index 0000000..9f554b6 --- /dev/null +++ b/sotopia_verifiable/cli/app.py @@ -0,0 +1,89 @@ +"""Command-line interface for Sotopia Verifiable.""" + +import sys +from typing import List, Optional + +from rich.console import Console + +console = Console() + + +def app(argv: Optional[List[str]] = None) -> int: + """Main entry point for the CLI. + + Args: + argv: Command line arguments + + Returns: + Exit code + """ + if argv is None: + argv = sys.argv[1:] + + console.print("[bold green]Sotopia Verifiable[/bold green]") + console.print("A collection of verifiable games in Sotopia format") + + if not argv: + console.print("\n[bold]Available commands:[/bold]") + console.print(" verify - Verify a game outcome") + console.print(" list - List available verification rules") + console.print("\nRun with --help for more information.") + return 0 + + command = argv[0] + + if command == "verify": + return _handle_verify(argv[1:]) + elif command == "list": + return _handle_list(argv[1:]) + elif command in ["--help", "-h", "help"]: + _print_help() + return 0 + else: + console.print(f"[bold red]Unknown command:[/bold red] {command}") + console.print("Run with --help for available commands.") + return 1 + + +def _handle_verify(args: List[str]) -> int: + """Handle the verify command. + + Args: + args: Command arguments + + Returns: + Exit code + """ + console.print("[bold]Verify command[/bold] (not implemented yet)") + return 0 + + +def _handle_list(args: List[str]) -> int: + """Handle the list command. + + Args: + args: Command arguments + + Returns: + Exit code + """ + console.print("[bold]List command[/bold] (not implemented yet)") + return 0 + + +def _print_help() -> None: + """Print help information.""" + console.print("[bold]Sotopia Verifiable CLI[/bold]") + console.print("\n[bold]Usage:[/bold]") + console.print(" sotopia-verifiable [command] [options]") + + console.print("\n[bold]Commands:[/bold]") + console.print(" verify - Verify a game outcome") + console.print(" list - List available verification rules") + + console.print("\n[bold]Options:[/bold]") + console.print(" --help, -h - Show this help message") + + +if __name__ == "__main__": + sys.exit(app()) \ No newline at end of file diff --git a/sotopia_verifiable/core/__init__.py b/sotopia_verifiable/core/__init__.py new file mode 100644 index 0000000..4e5f968 --- /dev/null +++ b/sotopia_verifiable/core/__init__.py @@ -0,0 +1,5 @@ +"""Core functionality for Sotopia Verifiable.""" + +from sotopia_verifiable.core.verifiable_game import VerifiableGame + +__all__ = ["VerifiableGame"] \ No newline at end of file diff --git a/sotopia_verifiable/core/verifiable_game.py b/sotopia_verifiable/core/verifiable_game.py new file mode 100644 index 0000000..2feb5ce --- /dev/null +++ b/sotopia_verifiable/core/verifiable_game.py @@ -0,0 +1,62 @@ +"""Verifiable game implementation for Sotopia.""" + +from typing import Any, Dict, List, Optional + +from pydantic import BaseModel, Field + + +class VerificationResult(BaseModel): + """Result of a verification process.""" + + is_valid: bool = Field(description="Whether the game outcome is valid") + score: float = Field(description="Verification score (0.0 to 1.0)") + details: Dict[str, Any] = Field(default_factory=dict, description="Detailed verification results") + + +class VerifiableGame: + """A game with verifiable outcomes in Sotopia. + + This class extends the standard Sotopia game with verification capabilities, + allowing for objective evaluation of game outcomes. + """ + + def __init__(self, game_config: Dict[str, Any]) -> None: + """Initialize a verifiable game. + + Args: + game_config: Configuration for the game + """ + self.game_config = game_config + self.verification_rules: List[Dict[str, Any]] = game_config.get("verification_rules", []) + + def verify(self, game_outcome: Dict[str, Any]) -> VerificationResult: + """Verify the outcome of a game against predefined rules. + + Args: + game_outcome: The outcome of the game to verify + + Returns: + VerificationResult: The result of the verification process + """ + # Placeholder implementation - to be extended in subclasses + return VerificationResult( + is_valid=True, + score=1.0, + details={"message": "Base verification - no rules applied"} + ) + + def get_verification_rules(self) -> List[Dict[str, Any]]: + """Get the verification rules for this game. + + Returns: + List of verification rules + """ + return self.verification_rules + + def add_verification_rule(self, rule: Dict[str, Any]) -> None: + """Add a verification rule to the game. + + Args: + rule: The rule to add + """ + self.verification_rules.append(rule) \ No newline at end of file diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..ce1a774 --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1 @@ +"""Tests for Sotopia Verifiable.""" \ No newline at end of file diff --git a/tests/test_cli.py b/tests/test_cli.py new file mode 100644 index 0000000..c36c722 --- /dev/null +++ b/tests/test_cli.py @@ -0,0 +1,41 @@ +"""Tests for the CLI.""" + +import pytest + +from sotopia_verifiable.cli.app import app + + +def test_cli_help(): + """Test that the CLI help command works.""" + exit_code = app(["--help"]) + assert exit_code == 0 + + exit_code = app(["-h"]) + assert exit_code == 0 + + exit_code = app(["help"]) + assert exit_code == 0 + + +def test_cli_no_args(): + """Test that the CLI works with no arguments.""" + exit_code = app([]) + assert exit_code == 0 + + +def test_cli_unknown_command(): + """Test that the CLI handles unknown commands.""" + exit_code = app(["unknown_command"]) + assert exit_code == 1 + + +def test_cli_verify_command(): + """Test that the verify command works.""" + exit_code = app(["verify"]) + assert exit_code == 0 + + +def test_cli_list_command(): + """Test that the list command works.""" + exit_code = app(["list"]) + assert exit_code == 0 \ No newline at end of file diff --git a/tests/test_verifiable_game.py b/tests/test_verifiable_game.py new file mode 100644 index 0000000..d5f522a --- /dev/null +++ b/tests/test_verifiable_game.py @@ -0,0 +1,43 @@ +"""Tests for the VerifiableGame class.""" + +import pytest + +from sotopia_verifiable.core.verifiable_game import VerifiableGame, VerificationResult + + +def test_verifiable_game_initialization(): + """Test that a VerifiableGame can be initialized.""" + game_config = {"name": "Test Game", "verification_rules": []} + game = VerifiableGame(game_config) + + assert game.game_config == game_config + assert game.verification_rules == [] + + +def test_verifiable_game_add_rule(): + """Test that verification rules can be added to a game.""" + game = VerifiableGame({"name": "Test Game"}) + + rule = {"type": "score_threshold", "min_score": 0.7} + game.add_verification_rule(rule) + + assert game.verification_rules == [rule] + + # Add another rule + rule2 = {"type": "time_limit", "max_seconds": 300} + game.add_verification_rule(rule2) + + assert game.verification_rules == [rule, rule2] + + +def test_verifiable_game_verify(): + """Test the basic verification functionality.""" + game = VerifiableGame({"name": "Test Game"}) + + # The base implementation should always return a valid result + result = game.verify({}) + + assert isinstance(result, VerificationResult) + assert result.is_valid is True + assert result.score == 1.0 + assert "message" in result.details \ No newline at end of file From 2e6838598071d32bc187ba17e31968f20c137f48 Mon Sep 17 00:00:00 2001 From: openhands Date: Mon, 7 Jul 2025 19:29:42 +0000 Subject: [PATCH 2/2] Update to use uv and Python 3.12 only --- .github/workflows/lint.yml | 13 +- .github/workflows/tests.yml | 16 +- pyproject.toml | 2 +- uv.lock | 332 ++++++++++++++++++++++++++++++++++++ 4 files changed, 349 insertions(+), 14 deletions(-) create mode 100644 uv.lock diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 2bc0b64..cf8bfd0 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -11,15 +11,18 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Set up Python + - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.12" + - name: Install uv + run: | + curl -LsSf https://astral.sh/uv/install.sh | sh + echo "$HOME/.cargo/bin" >> $GITHUB_PATH - name: Install dependencies run: | - python -m pip install --upgrade pip - python -m pip install ruff mypy - python -m pip install -e ".[test]" + uv pip install ruff mypy + uv pip install -e ".[test]" - name: Lint with ruff run: | ruff check . diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index f58096f..de38103 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -9,21 +9,21 @@ on: jobs: test: runs-on: ubuntu-latest - strategy: - matrix: - python-version: ["3.10", "3.11", "3.12"] steps: - uses: actions/checkout@v4 - - name: Set up Python ${{ matrix.python-version }} + - name: Set up Python 3.12 uses: actions/setup-python@v5 with: - python-version: ${{ matrix.python-version }} + python-version: "3.12" + - name: Install uv + run: | + curl -LsSf https://astral.sh/uv/install.sh | sh + echo "$HOME/.cargo/bin" >> $GITHUB_PATH - name: Install dependencies run: | - python -m pip install --upgrade pip - python -m pip install pytest pytest-cov - python -m pip install -e ".[test]" + uv pip install pytest pytest-cov + uv pip install -e ".[test]" - name: Test with pytest run: | pytest --cov=sotopia_verifiable tests/ \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index b97d578..1207f20 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ description = "A verifiable extension for Sotopia platform." authors = [ { name = "Xuhui Zhou", email = "xuhuiz@cs.cmu.edu" } ] -requires-python = ">=3.10, <3.13" +requires-python = "==3.12.*" license = { text = "MIT License" } readme = "README.md" diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..523a202 --- /dev/null +++ b/uv.lock @@ -0,0 +1,332 @@ +aact==0.0.10 +absl-py==2.3.1 +aiofiles==24.1.0 +aiohappyeyeballs==2.6.1 +aiohttp==3.12.13 +aiosignal==1.3.2 +aiostream==0.7.0 +annotated-types==0.7.0 +anthropic==0.54.0 +anyio==4.9.0 +argon2-cffi==25.1.0 +argon2-cffi-bindings==21.2.0 +arrow==1.3.0 +asttokens==3.0.0 +async-lru==2.0.5 +attrs==25.3.0 +authlib==1.6.0 +babel==2.17.0 +bashlex==0.18 +beartype==0.19.0 +beautifulsoup4==4.13.4 +bidict==0.23.1 +binaryornot==0.4.4 +bleach==6.2.0 +boto3==1.37.3 +botocore==1.37.3 +browsergym-core==0.13.3 +build==1.2.2.post1 +cachecontrol==0.14.3 +cachetools==5.5.2 +certifi==2025.4.26 +cffi==1.17.1 +chardet==5.2.0 +charset-normalizer==3.4.2 +cleo==2.1.0 +click==8.1.8 +cloudpickle==3.1.1 +clr-loader==0.2.7.post0 +cobble==0.1.4 +comm==0.2.2 +contourpy==1.3.2 +coverage==7.9.2 +crashtest==0.4.1 +cryptography==45.0.3 +cycler==0.12.1 +debugpy==1.8.14 +decorator==5.2.1 +defusedxml==0.7.1 +deprecated==1.2.18 +dirhash==0.5.0 +distlib==0.3.9 +distro==1.9.0 +docker==7.1.0 +docstring-parser==0.16 +dulwich==0.22.8 +durationpy==0.10 +et-xmlfile==2.0.0 +eval-type-backport==0.2.2 +exceptiongroup==1.3.0 +executing==2.2.0 +farama-notifications==0.0.4 +fastapi==0.115.13 +fastjsonschema==2.21.1 +fastmcp==2.6.1 +filelock==3.18.0 +findpython==0.6.3 +flake8==7.2.0 +fonttools==4.58.1 +fqdn==1.5.1 +frozenlist==1.6.0 +fsspec==2024.6.1 +gin-config==0.5.0 +gitdb==4.0.12 +gitpython==3.1.44 +google-ai-generativelanguage==0.6.15 +google-api-core==2.25.0 +google-api-python-client==2.173.0 +google-auth==2.40.2 +google-auth-httplib2==0.2.0 +google-auth-oauthlib==1.2.2 +google-cloud-aiplatform==1.97.0 +google-cloud-bigquery==3.34.0 +google-cloud-core==2.4.3 +google-cloud-resource-manager==1.14.2 +google-cloud-storage==2.19.0 +google-crc32c==1.7.1 +google-genai==1.18.0 +google-generativeai==0.8.5 +google-resumable-media==2.7.2 +googleapis-common-protos==1.70.0 +greenlet==3.2.2 +grep-ast==0.9.0 +grpc-google-iam-v1==0.14.2 +grpcio==1.72.1 +grpcio-status==1.62.3 +gymnasium==1.1.1 +h11==0.16.0 +hatchling==1.27.0 +hf-xet==1.1.2 +hiredis==3.2.1 +html2text==2025.4.15 +httpcore==1.0.9 +httplib2==0.22.0 +httpx==0.28.1 +httpx-sse==0.4.0 +huggingface-hub==0.32.4 +idna==3.10 +importlib-metadata==7.1.0 +iniconfig==2.1.0 +installer==0.7.0 +ipykernel==6.29.5 +ipython==9.3.0 +ipython-pygments-lexers==1.1.1 +ipywidgets==8.1.7 +isoduration==20.11.0 +jaraco-classes==3.4.0 +jaraco-context==6.0.1 +jaraco-functools==4.1.0 +jedi==0.19.2 +jeepney==0.9.0 +jinja2==3.1.6 +jiter==0.10.0 +jmespath==1.0.1 +joblib==1.5.1 +json-repair==0.35.0 +json5==0.12.0 +jsonpointer==3.0.0 +jsonschema==4.24.0 +jsonschema-specifications==2025.4.1 +jupyter-client==8.6.3 +jupyter-core==5.8.1 +jupyter-events==0.12.0 +jupyter-kernel-gateway==3.0.1 +jupyter-lsp==2.2.5 +jupyter-server==2.16.0 +jupyter-server-terminals==0.5.3 +jupyterlab==4.4.3 +jupyterlab-pygments==0.3.0 +jupyterlab-server==2.27.3 +jupyterlab-widgets==3.0.15 +keyring==25.6.0 +kiwisolver==1.4.8 +kubernetes==33.1.0 +libcst==1.5.0 +libtmux==0.39.0 +litellm==1.72.7 +lxml==5.4.0 +mammoth==1.9.1 +markdown-it-py==3.0.0 +markdownify==1.1.0 +markupsafe==3.0.2 +matplotlib==3.10.3 +matplotlib-inline==0.1.7 +mccabe==0.7.0 +mcp==1.9.2 +mdurl==0.1.2 +memory-profiler==0.61.0 +minio==7.2.15 +mistune==3.1.3 +more-itertools==10.7.0 +msgpack==1.1.0 +multidict==6.4.4 +nbclient==0.10.2 +nbconvert==7.16.6 +nbformat==5.10.4 +nest-asyncio==1.6.0 +networkx==3.5 +notebook==7.4.3 +notebook-shim==0.2.4 +numpy==2.3.0 +oauthlib==3.2.2 +openai==1.88.0 +openapi-pydantic==0.5.1 +openhands-aci==0.3.0 +openpyxl==3.1.5 +opentelemetry-api==1.34.1 +opentelemetry-exporter-otlp-proto-common==1.34.1 +opentelemetry-exporter-otlp-proto-grpc==1.34.1 +opentelemetry-proto==1.34.1 +opentelemetry-sdk==1.34.1 +opentelemetry-semantic-conventions==0.55b1 +overrides==7.7.0 +packaging==24.2 +pandas==2.3.0 +pandocfilters==1.5.1 +parso==0.8.4 +pathspec==0.12.1 +pbs-installer==2025.5.17 +pdfminer-six==20250506 +pettingzoo==1.24.3 +pexpect==4.9.0 +pillow==10.4.0 +pip==25.1.1 +pkginfo==1.12.1.2 +platformdirs==4.3.8 +playwright==1.52.0 +pluggy==1.6.0 +poetry==2.1.3 +poetry-core==2.1.3 +prometheus-client==0.22.1 +prompt-toolkit==3.0.51 +propcache==0.3.1 +proto-plus==1.26.1 +protobuf==5.29.5 +psutil==7.0.0 +ptyprocess==0.7.0 +pure-eval==0.2.3 +puremagic==1.29 +pyarrow==20.0.0 +pyasn1==0.6.1 +pyasn1-modules==0.4.2 +pycodestyle==2.13.0 +pycparser==2.22 +pycryptodome==3.23.0 +pydantic==2.11.5 +pydantic-core==2.33.2 +pydantic-settings==2.9.1 +pydub==0.25.1 +pyee==13.0.0 +pyflakes==3.3.2 +pygithub==2.6.1 +pygments==2.19.1 +pyjwt==2.9.0 +pylatexenc==2.10 +pynacl==1.5.0 +pyparsing==3.2.3 +pypdf==5.6.0 +pypdf2==3.0.1 +pyproject-hooks==1.2.0 +pytest==8.4.1 +pytest-asyncio==1.0.0 +pytest-cov==6.2.1 +python-dateutil==2.9.0.post0 +python-docx==1.2.0 +python-dotenv==1.1.0 +python-engineio==4.12.1 +python-frontmatter==1.1.0 +python-json-logger==3.3.0 +python-multipart==0.0.20 +python-pptx==1.0.2 +python-socketio==5.13.0 +python-ulid==1.1.0 +pythonnet==3.0.5 +pytz==2025.2 +pyyaml==6.0.2 +pyzmq==26.4.0 +qtconsole==5.6.1 +qtpy==2.4.3 +rapidfuzz==3.13.0 +redis==5.3.0 +redis-om==0.3.5 +referencing==0.36.2 +regex==2024.11.6 +requests==2.32.3 +requests-oauthlib==2.0.0 +requests-toolbelt==1.0.0 +rfc3339-validator==0.1.4 +rfc3986-validator==0.1.1 +rich==13.9.4 +rpds-py==0.25.1 +rq==2.4.0 +rsa==4.9.1 +s3transfer==0.11.3 +scantree==0.0.4 +secretstorage==3.3.3 +send2trash==1.8.3 +setuptools==80.9.0 +shapely==2.1.1 +shellingham==1.5.4 +simple-websocket==1.1.0 +six==1.17.0 +smmap==5.0.2 +sniffio==1.3.1 +sotopia==0.1.4 +-e file:///workspace/sotopia-verifiable +soupsieve==2.7 +speechrecognition==3.14.3 +sse-starlette==2.3.6 +stack-data==0.6.3 +starlette==0.46.2 +stripe==12.2.0 +tabulate==0.9.0 +tenacity==9.1.2 +termcolor==3.1.0 +terminado==0.18.1 +tiktoken==0.9.0 +tinycss2==1.4.0 +together==1.3.14 +tokenizers==0.21.1 +toml==0.10.2 +tomlkit==0.13.2 +tornado==6.5.1 +tqdm==4.67.1 +traitlets==5.14.3 +tree-sitter==0.24.0 +tree-sitter-c-sharp==0.23.1 +tree-sitter-embedded-template==0.23.2 +tree-sitter-language-pack==0.7.3 +tree-sitter-yaml==0.7.1 +trove-classifiers==2025.5.9.12 +typer==0.15.4 +types-cffi==1.17.0.20250523 +types-pyopenssl==24.1.0.20240722 +types-python-dateutil==2.9.0.20250516 +types-redis==4.6.0.20241004 +types-setuptools==80.9.0.20250529 +types-toml==0.10.8.20240310 +typing-extensions==4.14.0 +typing-inspection==0.4.1 +tzdata==2025.2 +uri-template==1.3.0 +uritemplate==4.2.0 +urllib3==2.4.0 +uv==0.7.19 +uvicorn==0.34.3 +virtualenv==20.31.2 +wcwidth==0.2.13 +webcolors==24.11.1 +webencodings==0.5.1 +websocket-client==1.8.0 +websockets==15.0.1 +whatthepatch==1.0.7 +widgetsnbextension==4.0.14 +wrapt==1.17.2 +wsproto==1.2.0 +xlrd==2.0.1 +xlsxwriter==3.2.3 +yarl==1.20.0 +youtube-transcript-api==1.0.3 +zipp==3.22.0 +zope-interface==7.2 +zstandard==0.23.0