# diffai-python
AI/ML specialized diff tool for deep tensor comparison and analysis - Python Package
[](https://badge.fury.io/py/diffai-python)
[](https://www.python.org/downloads/)
[](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[](https://badge.fury.io/py/diffai-python)\n[](https://www.python.org/downloads/)\n[](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"
}