diffai-python


Namediffai-python JSON
Version 0.3.16 PyPI version JSON
download
home_pageNone
SummaryAI/ML specialized diff tool for deep tensor comparison and analysis
upload_time2025-07-18 07:32:54
maintainerNone
docs_urlNone
authorkako-jun
requires_python>=3.8
licenseMIT
keywords ai ml machine-learning diff tensor pytorch safetensors numpy matlab model-comparison diffai artificial-intelligence
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # diffai-python

AI/ML specialized diff tool for deep tensor comparison and analysis - Python Package

[![PyPI version](https://badge.fury.io/py/diffai-python.svg)](https://badge.fury.io/py/diffai-python)
[![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

## Overview

**diffai-python** provides Python bindings for [diffai](https://github.com/kako-jun/diffai), an AI/ML specialized diff tool. This package bundles the high-performance Rust binary and provides a clean Python API for integration into ML workflows, notebooks, and automation scripts.

Following the same distribution pattern as [ruff](https://github.com/astral-sh/ruff), this package distributes a pre-compiled binary for maximum performance while providing a convenient Python interface.

## Features

- **High Performance**: Uses the native diffai Rust binary for maximum speed
- **Zero Dependencies**: Self-contained package with bundled binary
- **ML-Focused**: Specialized analysis for PyTorch, Safetensors, NumPy, and MATLAB files
- **Scientific Computing**: Full support for NumPy arrays and MATLAB .mat files
- **Multiple Output Formats**: CLI, JSON, and YAML outputs for different use cases
- **Python Integration**: Clean API for programmatic use in ML pipelines

## Installation

```bash
pip install diffai-python
```

## Quick Start

### Command Line Usage

After installation, the `diffai` command is available:

```bash
# Compare ML models (30+ analysis features automatic)
diffai model_v1.safetensors model_v2.safetensors

# Compare NumPy arrays
diffai data_v1.npy data_v2.npy

# JSON output for automation (all ML features included)
diffai model_v1.pt model_v2.pt --output json
```

### Python API Usage

```python
import diffai

# Basic comparison
result = diffai.diff("model_v1.safetensors", "model_v2.safetensors")
print(result.raw_output)

# With options
options = diffai.DiffOptions(
    output_format=diffai.OutputFormat.JSON
)
result = diffai.diff("model_v1.pt", "model_v2.pt", options)

# Access structured data
if result.is_json:
    data = result.data
    print(f"Found {len(data)} differences")
```

### Advanced ML Analysis

```python
# Comprehensive ML model analysis (automatic for ML models)
result = diffai.diff(
    "baseline.safetensors", 
    "improved.safetensors",
    stats=True  # Enable statistical analysis
)

print(result.raw_output)

# ML-specific analysis features (automatic for ML models)
# - architecture_comparison: Model architecture and structural changes
# - memory_analysis: Memory usage and optimization opportunities
# - anomaly_detection: Numerical anomalies and training issues
# - convergence_analysis: Training convergence patterns
# - gradient_analysis: Gradient flow health assessment
# - quantization_analysis: Quantization effect analysis
```

## Supported Formats

### Input Formats
- **ML Models**: `.safetensors`, `.pt`, `.pth`, `.bin` (PyTorch)
- **Scientific Data**: `.npy`, `.npz` (NumPy), `.mat` (MATLAB)  
- **Structured Data**: `.json`, `.yaml`, `.toml`, `.xml`, `.ini`, `.csv`

### Output Formats
- **CLI**: Colored terminal output (default)
- **JSON**: Machine-readable format for automation
- **YAML**: Human-readable structured format

## ML Analysis Features (Automatic)

The package provides 30+ specialized ML analysis features that run automatically for PyTorch and Safetensors files:

- **Detailed tensor statistics**: Mean, std, min, max, shape, dtype
- **Model structure comparison**: Architecture and structural changes
- **Memory usage analysis**: Memory optimization opportunities
- **Numerical anomaly detection**: Training issues and anomalies
- **Training convergence analysis**: Convergence patterns
- **Gradient information analysis**: Gradient flow health
- **Layer similarity comparison**: Inter-layer analysis
- **Detailed change summary**: Comprehensive change patterns
- **Quantization impact analysis**: Quantization effects
- **Change magnitude sorting**: Priority-sorted differences
- **Plus 20+ additional specialized features**

## API Reference

### Main Functions

```python
# Compare two files
def diff(input1: str, input2: str, options: Optional[DiffOptions] = None, **kwargs) -> DiffResult

# Main CLI entry point
def main() -> None
```

### Configuration

```python
@dataclass
class DiffOptions:
    # Basic options
    input_format: Optional[str] = None
    output_format: Optional[OutputFormat] = None
    recursive: bool = False
    verbose: bool = False
    
    # For scientific data (NumPy/MATLAB)
    stats: bool = False  # Only used for NumPy/MATLAB files
    # Note: ML analysis runs automatically for PyTorch/Safetensors
```

### Results

```python
class DiffResult:
    raw_output: str           # Raw output from diffai
    format_type: str          # Output format used
    return_code: int          # Process return code
    
    @property
    def data(self) -> Any     # Parsed data (JSON when applicable)
    
    @property  
    def is_json(self) -> bool # True if JSON format
```

## Use Cases

### Research & Development
```python
# Compare fine-tuning results
before = "model_baseline.safetensors"
after = "model_finetuned.safetensors"

result = diffai.diff(before, after)
```

### MLOps Integration
```python
# Automated model validation in CI/CD
def validate_model_changes(old_model, new_model):
    result = diffai.diff(old_model, new_model,
                        output_format=diffai.OutputFormat.JSON)
    
    if result.is_json:
        # Check for critical issues
        for item in result.data:
            if 'AnomalyDetection' in item and 'critical' in str(item):
                raise ValueError("Critical model anomaly detected")
    
    return result

### MLflow Integration
```python
import mlflow
import diffai

def log_model_comparison(run_id1, run_id2):
    """Compare models between MLflow runs"""
    
    # Download models from MLflow
    model1_path = mlflow.artifacts.download_artifacts(
        run_id=run_id1, artifact_path="model/model.pt"
    )
    model2_path = mlflow.artifacts.download_artifacts(
        run_id=run_id2, artifact_path="model/model.pt"
    )
    
    # Compare with diffai
    result = diffai.diff(model1_path, model2_path,
                        output_format=diffai.OutputFormat.JSON)
    
    # Log results to MLflow
    with mlflow.start_run():
        mlflow.log_dict(result.data, "model_comparison.json")
        if result.is_json:
            # Extract metrics for logging
            for item in result.data:
                if 'TensorStatsChanged' in item:
                    mlflow.log_metric("tensor_changes", len(result.data))
                    break
                    
    return result

### Weights & Biases Integration  
```python
import wandb
import diffai

def log_model_comparison_wandb(model1_path, model2_path):
    """Log model comparison to Weights & Biases"""
    
    result = diffai.diff(model1_path, model2_path,
                        output_format=diffai.OutputFormat.JSON)
    
    # Log to wandb
    wandb.log({"model_comparison": result.data})
    
    if result.is_json:
        # Log specific metrics
        memory_changes = [item for item in result.data if 'MemoryAnalysis' in item]
        if memory_changes:
            wandb.log({"memory_impact_detected": len(memory_changes)})
            
    return result
```

### Jupyter Notebooks
```python
# Interactive analysis in notebooks
result = diffai.diff("checkpoint_100.pt", "checkpoint_200.pt")

# Display results
if result.is_json:
    from IPython.display import display, JSON
    display(JSON(result.data))
else:
    print(result.raw_output)
```

## Binary Distribution

This package follows the same pattern as [ruff](https://github.com/astral-sh/ruff):

- Pre-compiled `diffai` binary is bundled with the Python package
- No external dependencies or system requirements
- Cross-platform compatibility (Windows, macOS, Linux)
- Maximum performance through native Rust implementation

## Testing

Run the integration tests:

```bash
cd diffai-python
python test_integration.py
```

The test suite includes:
- Binary availability verification
- Basic diff functionality
- JSON output parsing
- ML analysis options
- Error handling

## Contributing

This package is part of the [diffai](https://github.com/kako-jun/diffai) project. Please see the main repository for contribution guidelines.

## License

MIT License - see [LICENSE](../LICENSE) for details.

## Related Projects

- **[diffai](https://github.com/kako-jun/diffai)**: Main Rust CLI tool
- **[diffx](https://github.com/kako-jun/diffx)**: Generic structured data diff tool
- **[ruff](https://github.com/astral-sh/ruff)**: Inspiration for Python packaging approach

## Error Handling

The diffai-python package provides comprehensive error handling for various failure scenarios:

### DiffaiError
The base exception class for all diffai-related errors:

```python
import diffai

try:
    result = diffai.diff("model1.pt", "model2.pt")
except diffai.DiffaiError as e:
    print(f"Diffai error: {e}")
```

### BinaryNotFoundError
Raised when the diffai binary cannot be found:

```python
import diffai

try:
    result = diffai.diff("model1.pt", "model2.pt")
except diffai.DiffaiError as e:
    if "binary not found" in str(e):
        print("Please install diffai binary or ensure it's in PATH")
        # Fallback or installation logic here
```

### Binary Installation
If the binary is not found, you can install it manually:

```bash
# Install via pip (includes binary)
pip install diffai-python

# Or install Rust version globally
cargo install diffai-cli
```

## License

This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "diffai-python",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "ai, ml, machine-learning, diff, tensor, pytorch, safetensors, numpy, matlab, model-comparison, diffai, artificial-intelligence",
    "author": "kako-jun",
    "author_email": null,
    "download_url": null,
    "platform": null,
    "description": "# diffai-python\n\nAI/ML specialized diff tool for deep tensor comparison and analysis - Python Package\n\n[![PyPI version](https://badge.fury.io/py/diffai-python.svg)](https://badge.fury.io/py/diffai-python)\n[![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n## Overview\n\n**diffai-python** provides Python bindings for [diffai](https://github.com/kako-jun/diffai), an AI/ML specialized diff tool. This package bundles the high-performance Rust binary and provides a clean Python API for integration into ML workflows, notebooks, and automation scripts.\n\nFollowing the same distribution pattern as [ruff](https://github.com/astral-sh/ruff), this package distributes a pre-compiled binary for maximum performance while providing a convenient Python interface.\n\n## Features\n\n- **High Performance**: Uses the native diffai Rust binary for maximum speed\n- **Zero Dependencies**: Self-contained package with bundled binary\n- **ML-Focused**: Specialized analysis for PyTorch, Safetensors, NumPy, and MATLAB files\n- **Scientific Computing**: Full support for NumPy arrays and MATLAB .mat files\n- **Multiple Output Formats**: CLI, JSON, and YAML outputs for different use cases\n- **Python Integration**: Clean API for programmatic use in ML pipelines\n\n## Installation\n\n```bash\npip install diffai-python\n```\n\n## Quick Start\n\n### Command Line Usage\n\nAfter installation, the `diffai` command is available:\n\n```bash\n# Compare ML models (30+ analysis features automatic)\ndiffai model_v1.safetensors model_v2.safetensors\n\n# Compare NumPy arrays\ndiffai data_v1.npy data_v2.npy\n\n# JSON output for automation (all ML features included)\ndiffai model_v1.pt model_v2.pt --output json\n```\n\n### Python API Usage\n\n```python\nimport diffai\n\n# Basic comparison\nresult = diffai.diff(\"model_v1.safetensors\", \"model_v2.safetensors\")\nprint(result.raw_output)\n\n# With options\noptions = diffai.DiffOptions(\n    output_format=diffai.OutputFormat.JSON\n)\nresult = diffai.diff(\"model_v1.pt\", \"model_v2.pt\", options)\n\n# Access structured data\nif result.is_json:\n    data = result.data\n    print(f\"Found {len(data)} differences\")\n```\n\n### Advanced ML Analysis\n\n```python\n# Comprehensive ML model analysis (automatic for ML models)\nresult = diffai.diff(\n    \"baseline.safetensors\", \n    \"improved.safetensors\",\n    stats=True  # Enable statistical analysis\n)\n\nprint(result.raw_output)\n\n# ML-specific analysis features (automatic for ML models)\n# - architecture_comparison: Model architecture and structural changes\n# - memory_analysis: Memory usage and optimization opportunities\n# - anomaly_detection: Numerical anomalies and training issues\n# - convergence_analysis: Training convergence patterns\n# - gradient_analysis: Gradient flow health assessment\n# - quantization_analysis: Quantization effect analysis\n```\n\n## Supported Formats\n\n### Input Formats\n- **ML Models**: `.safetensors`, `.pt`, `.pth`, `.bin` (PyTorch)\n- **Scientific Data**: `.npy`, `.npz` (NumPy), `.mat` (MATLAB)  \n- **Structured Data**: `.json`, `.yaml`, `.toml`, `.xml`, `.ini`, `.csv`\n\n### Output Formats\n- **CLI**: Colored terminal output (default)\n- **JSON**: Machine-readable format for automation\n- **YAML**: Human-readable structured format\n\n## ML Analysis Features (Automatic)\n\nThe package provides 30+ specialized ML analysis features that run automatically for PyTorch and Safetensors files:\n\n- **Detailed tensor statistics**: Mean, std, min, max, shape, dtype\n- **Model structure comparison**: Architecture and structural changes\n- **Memory usage analysis**: Memory optimization opportunities\n- **Numerical anomaly detection**: Training issues and anomalies\n- **Training convergence analysis**: Convergence patterns\n- **Gradient information analysis**: Gradient flow health\n- **Layer similarity comparison**: Inter-layer analysis\n- **Detailed change summary**: Comprehensive change patterns\n- **Quantization impact analysis**: Quantization effects\n- **Change magnitude sorting**: Priority-sorted differences\n- **Plus 20+ additional specialized features**\n\n## API Reference\n\n### Main Functions\n\n```python\n# Compare two files\ndef diff(input1: str, input2: str, options: Optional[DiffOptions] = None, **kwargs) -> DiffResult\n\n# Main CLI entry point\ndef main() -> None\n```\n\n### Configuration\n\n```python\n@dataclass\nclass DiffOptions:\n    # Basic options\n    input_format: Optional[str] = None\n    output_format: Optional[OutputFormat] = None\n    recursive: bool = False\n    verbose: bool = False\n    \n    # For scientific data (NumPy/MATLAB)\n    stats: bool = False  # Only used for NumPy/MATLAB files\n    # Note: ML analysis runs automatically for PyTorch/Safetensors\n```\n\n### Results\n\n```python\nclass DiffResult:\n    raw_output: str           # Raw output from diffai\n    format_type: str          # Output format used\n    return_code: int          # Process return code\n    \n    @property\n    def data(self) -> Any     # Parsed data (JSON when applicable)\n    \n    @property  \n    def is_json(self) -> bool # True if JSON format\n```\n\n## Use Cases\n\n### Research & Development\n```python\n# Compare fine-tuning results\nbefore = \"model_baseline.safetensors\"\nafter = \"model_finetuned.safetensors\"\n\nresult = diffai.diff(before, after)\n```\n\n### MLOps Integration\n```python\n# Automated model validation in CI/CD\ndef validate_model_changes(old_model, new_model):\n    result = diffai.diff(old_model, new_model,\n                        output_format=diffai.OutputFormat.JSON)\n    \n    if result.is_json:\n        # Check for critical issues\n        for item in result.data:\n            if 'AnomalyDetection' in item and 'critical' in str(item):\n                raise ValueError(\"Critical model anomaly detected\")\n    \n    return result\n\n### MLflow Integration\n```python\nimport mlflow\nimport diffai\n\ndef log_model_comparison(run_id1, run_id2):\n    \"\"\"Compare models between MLflow runs\"\"\"\n    \n    # Download models from MLflow\n    model1_path = mlflow.artifacts.download_artifacts(\n        run_id=run_id1, artifact_path=\"model/model.pt\"\n    )\n    model2_path = mlflow.artifacts.download_artifacts(\n        run_id=run_id2, artifact_path=\"model/model.pt\"\n    )\n    \n    # Compare with diffai\n    result = diffai.diff(model1_path, model2_path,\n                        output_format=diffai.OutputFormat.JSON)\n    \n    # Log results to MLflow\n    with mlflow.start_run():\n        mlflow.log_dict(result.data, \"model_comparison.json\")\n        if result.is_json:\n            # Extract metrics for logging\n            for item in result.data:\n                if 'TensorStatsChanged' in item:\n                    mlflow.log_metric(\"tensor_changes\", len(result.data))\n                    break\n                    \n    return result\n\n### Weights & Biases Integration  \n```python\nimport wandb\nimport diffai\n\ndef log_model_comparison_wandb(model1_path, model2_path):\n    \"\"\"Log model comparison to Weights & Biases\"\"\"\n    \n    result = diffai.diff(model1_path, model2_path,\n                        output_format=diffai.OutputFormat.JSON)\n    \n    # Log to wandb\n    wandb.log({\"model_comparison\": result.data})\n    \n    if result.is_json:\n        # Log specific metrics\n        memory_changes = [item for item in result.data if 'MemoryAnalysis' in item]\n        if memory_changes:\n            wandb.log({\"memory_impact_detected\": len(memory_changes)})\n            \n    return result\n```\n\n### Jupyter Notebooks\n```python\n# Interactive analysis in notebooks\nresult = diffai.diff(\"checkpoint_100.pt\", \"checkpoint_200.pt\")\n\n# Display results\nif result.is_json:\n    from IPython.display import display, JSON\n    display(JSON(result.data))\nelse:\n    print(result.raw_output)\n```\n\n## Binary Distribution\n\nThis package follows the same pattern as [ruff](https://github.com/astral-sh/ruff):\n\n- Pre-compiled `diffai` binary is bundled with the Python package\n- No external dependencies or system requirements\n- Cross-platform compatibility (Windows, macOS, Linux)\n- Maximum performance through native Rust implementation\n\n## Testing\n\nRun the integration tests:\n\n```bash\ncd diffai-python\npython test_integration.py\n```\n\nThe test suite includes:\n- Binary availability verification\n- Basic diff functionality\n- JSON output parsing\n- ML analysis options\n- Error handling\n\n## Contributing\n\nThis package is part of the [diffai](https://github.com/kako-jun/diffai) project. Please see the main repository for contribution guidelines.\n\n## License\n\nMIT License - see [LICENSE](../LICENSE) for details.\n\n## Related Projects\n\n- **[diffai](https://github.com/kako-jun/diffai)**: Main Rust CLI tool\n- **[diffx](https://github.com/kako-jun/diffx)**: Generic structured data diff tool\n- **[ruff](https://github.com/astral-sh/ruff)**: Inspiration for Python packaging approach\n\n## Error Handling\n\nThe diffai-python package provides comprehensive error handling for various failure scenarios:\n\n### DiffaiError\nThe base exception class for all diffai-related errors:\n\n```python\nimport diffai\n\ntry:\n    result = diffai.diff(\"model1.pt\", \"model2.pt\")\nexcept diffai.DiffaiError as e:\n    print(f\"Diffai error: {e}\")\n```\n\n### BinaryNotFoundError\nRaised when the diffai binary cannot be found:\n\n```python\nimport diffai\n\ntry:\n    result = diffai.diff(\"model1.pt\", \"model2.pt\")\nexcept diffai.DiffaiError as e:\n    if \"binary not found\" in str(e):\n        print(\"Please install diffai binary or ensure it's in PATH\")\n        # Fallback or installation logic here\n```\n\n### Binary Installation\nIf the binary is not found, you can install it manually:\n\n```bash\n# Install via pip (includes binary)\npip install diffai-python\n\n# Or install Rust version globally\ncargo install diffai-cli\n```\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "AI/ML specialized diff tool for deep tensor comparison and analysis",
    "version": "0.3.16",
    "project_urls": {
        "Changelog": "https://github.com/kako-jun/diffai/blob/main/CHANGELOG.md",
        "Documentation": "https://github.com/kako-jun/diffai/blob/main/docs/",
        "Homepage": "https://github.com/kako-jun/diffai",
        "Issues": "https://github.com/kako-jun/diffai/issues",
        "Repository": "https://github.com/kako-jun/diffai.git"
    },
    "split_keywords": [
        "ai",
        " ml",
        " machine-learning",
        " diff",
        " tensor",
        " pytorch",
        " safetensors",
        " numpy",
        " matlab",
        " model-comparison",
        " diffai",
        " artificial-intelligence"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "34e8357f46c4029043780245ad5da00eaf3b9ae709202a5bd3f640f7f874c344",
                "md5": "d84a3ee04e6ad7849c14758b29b06cf7",
                "sha256": "6f720394fd8e19f95ed85f5910a772fc925bcc641aa3a03b4aae2ab83c579516"
            },
            "downloads": -1,
            "filename": "diffai_python-0.3.16-py3-none-macosx_10_12_x86_64.whl",
            "has_sig": false,
            "md5_digest": "d84a3ee04e6ad7849c14758b29b06cf7",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 210731,
            "upload_time": "2025-07-18T07:32:54",
            "upload_time_iso_8601": "2025-07-18T07:32:54.271506Z",
            "url": "https://files.pythonhosted.org/packages/34/e8/357f46c4029043780245ad5da00eaf3b9ae709202a5bd3f640f7f874c344/diffai_python-0.3.16-py3-none-macosx_10_12_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "83beacb972b78c1be7b997410a11ff1dbc2aa43a953a90a74cc1d1f7881566e3",
                "md5": "f08b7e57055b056e103795f70ccaa9f9",
                "sha256": "73db8e7b3fee456efb21f557e77a0027e8af45fd39377ecec27859c430e30f08"
            },
            "downloads": -1,
            "filename": "diffai_python-0.3.16-py3-none-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "f08b7e57055b056e103795f70ccaa9f9",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 204071,
            "upload_time": "2025-07-18T07:32:53",
            "upload_time_iso_8601": "2025-07-18T07:32:53.751018Z",
            "url": "https://files.pythonhosted.org/packages/83/be/acb972b78c1be7b997410a11ff1dbc2aa43a953a90a74cc1d1f7881566e3/diffai_python-0.3.16-py3-none-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "fa065aa7ebdec1b72ec02422e676cebc8ee869c31475e6d8d20235997ee5f7b7",
                "md5": "88156087c3a116ca9a156da8875254cf",
                "sha256": "9c3d5ca8eee2db9668102b487960c965befd1d2fbf9ffa3fddf438653eab7c02"
            },
            "downloads": -1,
            "filename": "diffai_python-0.3.16-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "88156087c3a116ca9a156da8875254cf",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 223444,
            "upload_time": "2025-07-18T07:33:31",
            "upload_time_iso_8601": "2025-07-18T07:33:31.025750Z",
            "url": "https://files.pythonhosted.org/packages/fa/06/5aa7ebdec1b72ec02422e676cebc8ee869c31475e6d8d20235997ee5f7b7/diffai_python-0.3.16-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "6f44fd669391fe2e440a54175b310d1c07619ccc90739255315253937a79f640",
                "md5": "3ad27b20d2e8c4bd50a462b3f0cdf22b",
                "sha256": "9417fdedce1ba0daa07078983e8b636401da513cede24f96ab9fa5592858fcdc"
            },
            "downloads": -1,
            "filename": "diffai_python-0.3.16-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "3ad27b20d2e8c4bd50a462b3f0cdf22b",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 225544,
            "upload_time": "2025-07-18T07:33:04",
            "upload_time_iso_8601": "2025-07-18T07:33:04.078503Z",
            "url": "https://files.pythonhosted.org/packages/6f/44/fd669391fe2e440a54175b310d1c07619ccc90739255315253937a79f640/diffai_python-0.3.16-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "92b5cf2165e5ee1df21d472e30c6f57b02413d4b439b41e18366aa7e689d601b",
                "md5": "ff7edc9b7692b189988ebc89093a1173",
                "sha256": "e571929a3b0086c2c21af0d3868572182e20b9a9b76983a478630b32ea809eab"
            },
            "downloads": -1,
            "filename": "diffai_python-0.3.16-py3-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "ff7edc9b7692b189988ebc89093a1173",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 125019,
            "upload_time": "2025-07-18T07:34:08",
            "upload_time_iso_8601": "2025-07-18T07:34:08.330994Z",
            "url": "https://files.pythonhosted.org/packages/92/b5/cf2165e5ee1df21d472e30c6f57b02413d4b439b41e18366aa7e689d601b/diffai_python-0.3.16-py3-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-18 07:32:54",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "kako-jun",
    "github_project": "diffai",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "diffai-python"
}
        
Elapsed time: 1.60049s