diff --git a/.gitignore b/.gitignore index a595a0d..90d6c3b 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ __pycache__ # environments .pyenv .env +.envrc # data data/articles/ @@ -25,6 +26,7 @@ data/unique_pmcids.json data/pmid_list.json data/downloaded_pmcids.json data/markdown +data/extractions/ *.zip *.tar.gz diff --git a/README.MD b/README.MD index d4ca413..10bf59e 100644 --- a/README.MD +++ b/README.MD @@ -44,3 +44,8 @@ We manage a few repos externally: ## System Overview ![Annotations Diagram](assets/annotations_diagram.svg) +## Downloading the data +``` +pixi run gdown —-id 1qtQWvi0x_k5_JofgrfsgkWzlIdb6isr9 +unzip autogkb-data.zip +``` \ No newline at end of file diff --git a/benchmark_example.py b/benchmark_example.py deleted file mode 100644 index cd8098b..0000000 --- a/benchmark_example.py +++ /dev/null @@ -1,274 +0,0 @@ -#!/usr/bin/env python3 -""" -Example usage of the AutoGKB benchmarking system. - -This script demonstrates how to use the benchmarking framework to evaluate -language models on pharmacogenomic knowledge extraction tasks. - -The benchmark system now supports two modes: - -1. **Separated Response Generation and Evaluation**: - - Generate model responses and save to JSONL files - - Evaluate JSONL files separately to get scores - - Allows for response caching and reuse across different evaluation metrics - -2. **Combined Mode** (legacy): - - Generate responses and evaluate in one step - -Usage examples: - python benchmark_example.py # Run full benchmark - python benchmark_example.py --validate # Quick validation - python benchmark_example.py --evaluate file.jsonl # Evaluate specific response file -""" - -import os -from pathlib import Path -from loguru import logger -from src.benchmark import BenchmarkPipeline, BenchmarkConfig -from dotenv import load_dotenv - -load_dotenv() -logger.add("benchmark_example.log", rotation="10 MB") - -def main(): - """Main example demonstrating benchmark usage.""" - - # 1. Create configuration - config = BenchmarkConfig( - data_dir=Path("data"), - articles_dir=Path("data/articles"), - benchmark_dir=Path("data/benchmark"), - output_dir=Path("benchmark_results"), - model_name="claude-3-sonnet", # Start with mock model for testing - max_articles=10, # Limit for example - batch_size=5 - ) - - # 2. Initialize pipeline - pipeline = BenchmarkPipeline(config) - - # 3. Validate setup - logger.info("Validating benchmark setup...") - validation = pipeline.validate_setup() - - if not validation["config_valid"]: - logger.error("Setup validation failed:") - for issue in validation["issues"]: - logger.error(f" - {issue}") - return - - logger.info("Setup validation passed!") - logger.info(f"Data statistics: {validation['data_statistics']}") - - # 4. Get data statistics - logger.info("Loading data statistics...") - stats = pipeline.get_data_statistics("train") - logger.info(f"Training data: {stats['total_samples']} samples") - logger.info(f"Average article length: {stats['avg_article_length']:.0f} characters") - - # 5. Run benchmark on test models - model_configs = [ - { - "name": "claude-3-sonnet", - "model_name": "claude-3-sonnet-20240229", - "api_key": os.getenv("ANTHROPIC_API_KEY"), - "temperature": 0.0, - "max_tokens": 4000 - } - ] - - # Add real models if API keys are available - if os.getenv("OPENAI_API_KEY"): - model_configs.append({ - "name": "gpt-4", - "model_name": "gpt-4", - "api_key": os.getenv("OPENAI_API_KEY"), - "temperature": 0.0, - "max_tokens": 4000 - }) - - if os.getenv("ANTHROPIC_API_KEY"): - model_configs.append({ - "name": "claude-3-sonnet", - "model_name": "claude-3-sonnet-20240229", - "api_key": os.getenv("ANTHROPIC_API_KEY"), - "temperature": 0.0, - "max_tokens": 4000 - }) - - # 6. Generate responses first (separate from evaluation) - logger.info(f"Generating responses with {len(model_configs)} models...") - - try: - # Step 1: Generate responses and save to JSONL files - response_files = pipeline.generate_responses(model_configs, split="train") # Using train for example - - logger.info(f"Generated {len(response_files)} response files:") - for model_name, response_file in response_files.items(): - logger.info(f" {model_name}: {response_file}") - - # Step 2: Evaluate each response file separately - logger.info("Evaluating response files...") - results = {} - for model_name, response_file in response_files.items(): - logger.info(f"Evaluating {model_name} responses...") - result = pipeline.evaluate_responses_file(response_file) - results[model_name] = result - - # 7. Print summary results - logger.info("\n" + "="*50) - logger.info("BENCHMARK RESULTS SUMMARY") - logger.info("="*50) - - for model_name, result in results.items(): - metrics = result.aggregate_metrics - logger.info(f"\nModel: {model_name}") - logger.info(f" Total samples: {result.total_samples}") - logger.info(f" Successful predictions: {result.successful_predictions}") - logger.info(f" Success rate: {result.successful_predictions/result.total_samples*100:.1f}%") - logger.info(f" Mean overall score: {metrics.get('mean_overall_score', 0):.3f}") - logger.info(f" Mean weighted score: {metrics.get('mean_weighted_score', 0):.3f}") - - # Show top performing fields - field_stats = metrics.get('field_statistics', {}) - if field_stats: - best_fields = sorted( - field_stats.items(), - key=lambda x: x[1].get('mean_score', 0), - reverse=True - )[:3] - - logger.info(" Top performing fields:") - for field, stats in best_fields: - score = stats.get('mean_score', 0) - exact_match = stats.get('exact_match_rate', 0) * 100 - logger.info(f" {field}: {score:.3f} (exact match: {exact_match:.1f}%)") - - # 8. Analyze a specific sample - if results and config.max_articles and config.max_articles > 0: - logger.info("\n" + "="*50) - logger.info("SAMPLE ANALYSIS") - logger.info("="*50) - - # Get first PMCID from results - first_result = next(iter(results.values())) - if first_result.sample_scores: - sample_pmcid = first_result.sample_scores[0].pmcid - - logger.info(f"Analyzing sample: {sample_pmcid}") - - # Analyze with first available model - first_model_config = model_configs[0] - analysis = pipeline.analyze_sample( - sample_pmcid, - first_model_config, - split="train" - ) - - logger.info(f"Article title: {analysis['article_title']}") - logger.info(f"Model: {analysis['model']}") - - if analysis['scores']: - logger.info(f"Overall score: {analysis['scores']['overall_score']:.3f}") - logger.info(f"Weighted score: {analysis['scores']['weighted_score']:.3f}") - - logger.info("\n" + "="*50) - logger.info("Benchmark completed successfully!") - logger.info(f"Results saved to: {config.output_dir}") - logger.info("="*50) - - except Exception as e: - logger.error(f"Benchmark failed: {e}") - raise - - -def run_quick_validation(): - """Quick validation without running full benchmark.""" - config = BenchmarkConfig(max_articles=1) - pipeline = BenchmarkPipeline(config) - - validation = pipeline.validate_setup() - - print("=== BENCHMARK VALIDATION ===") - print(f"Config valid: {validation['config_valid']}") - print(f"Data available: {validation['data_available']}") - - if validation.get('data_statistics'): - stats = validation['data_statistics'] - print(f"Train samples: {stats.get('train_samples', 0)}") - print(f"Val samples: {stats.get('val_samples', 0)}") - print(f"Test samples: {stats.get('test_samples', 0)}") - - print("\nModel accessibility:") - for model, accessible in validation.get('models_accessible', {}).items(): - print(f" {model}: {'✓' if accessible else '✗'}") - - if validation.get('issues'): - print("\nIssues found:") - for issue in validation['issues']: - print(f" - {issue}") - - return validation['config_valid'] - - -def evaluate_response_file(response_file_path: str): - """Example of evaluating a standalone JSONL response file.""" - logger.info(f"Evaluating standalone response file: {response_file_path}") - - # Create minimal config for evaluation only - config = BenchmarkConfig( - data_dir=Path("data"), - articles_dir=Path("data/articles"), - benchmark_dir=Path("data/benchmark"), - output_dir=Path("benchmark_results") - ) - - # Initialize pipeline - pipeline = BenchmarkPipeline(config) - - # Evaluate the response file - try: - result = pipeline.evaluate_responses_file(Path(response_file_path)) - - logger.info("\n" + "="*50) - logger.info("EVALUATION RESULTS") - logger.info("="*50) - logger.info(f"Model: {result.model_name}") - logger.info(f"Total samples: {result.total_samples}") - logger.info(f"Successful predictions: {result.successful_predictions}") - logger.info(f"Success rate: {result.successful_predictions/result.total_samples*100:.1f}%") - - metrics = result.aggregate_metrics - logger.info(f"Mean overall score: {metrics.get('mean_overall_score', 0):.3f}") - logger.info(f"Mean weighted score: {metrics.get('mean_weighted_score', 0):.3f}") - - # Show field performance - field_stats = metrics.get('field_statistics', {}) - if field_stats: - logger.info("\nField performance:") - for field, stats in field_stats.items(): - score = stats.get('mean_score', 0) - exact_match = stats.get('exact_match_rate', 0) * 100 - logger.info(f" {field}: {score:.3f} (exact match: {exact_match:.1f}%)") - - return result - - except Exception as e: - logger.error(f"Evaluation failed: {e}") - raise - - -if __name__ == "__main__": - import sys - - if len(sys.argv) > 1 and sys.argv[1] == "--validate": - # Quick validation mode - success = run_quick_validation() - sys.exit(0 if success else 1) - elif len(sys.argv) > 2 and sys.argv[1] == "--evaluate": - # Evaluate specific response file - response_file = sys.argv[2] - evaluate_response_file(response_file) - else: - # Full benchmark mode - main() \ No newline at end of file diff --git a/docs/EFFICIENCY_ANALYSIS.md b/docs/EFFICIENCY_ANALYSIS.md new file mode 100644 index 0000000..b713c2d --- /dev/null +++ b/docs/EFFICIENCY_ANALYSIS.md @@ -0,0 +1,96 @@ +# AutoGKB Efficiency Analysis Report + +## Overview +This report documents efficiency issues identified in the AutoGKB codebase and provides recommendations for improvements. + +## Critical Efficiency Issues + +### 1. Inefficient JSON File Loading (HIGH PRIORITY) +**Location**: `src/utils.py:79-84` - `get_true_variants()` function + +**Issue**: The function opens and parses a JSON file on every call, causing unnecessary disk I/O operations. + +```python +def get_true_variants(pmcid): + true_variant_list = json.load(open("data/benchmark/true_variant_list.json")) + return true_variant_list[pmcid] +``` + +**Impact**: +- Repeated file I/O operations for each function call +- JSON parsing overhead on every access +- Potential file handle leaks (file not properly closed) +- Poor performance when processing multiple PMCIDs + +**Solution**: Implement module-level caching with lazy loading to load the JSON file only once. + +### 2. Type Annotation Issues (MEDIUM PRIORITY) +**Locations**: Multiple files with incorrect type annotations + +**Issues**: +- `src/utils.py`: Functions use `str = None` instead of `Optional[str]` +- `src/inference.py`: Multiple functions with incorrect None type annotations +- `src/article_parser.py`: Type mismatches in function parameters +- `src/components/`: Similar type annotation issues across component files + +**Impact**: +- Static type checking failures +- Potential runtime errors +- Poor code maintainability +- IDE/tooling issues + +### 3. Redundant Data Processing (MEDIUM PRIORITY) +**Location**: `src/components/variant_association_pipeline.py` + +**Issue**: The pipeline calls `get_article_text()` multiple times for the same article across different processing steps. + +**Impact**: +- Redundant file I/O operations +- Unnecessary string processing +- Memory inefficiency + +### 4. Inefficient List Iteration Patterns (LOW PRIORITY) +**Location**: `src/utils.py:55-66` - `compare_lists()` function + +**Issue**: Multiple iterations over the same lists for coloring operations. + +**Impact**: +- Multiple O(n) operations that could be combined +- Redundant set membership checks + +## Implemented Fix + +### JSON Caching Optimization +**File**: `src/utils.py` +**Function**: `get_true_variants()` + +**Changes**: +- Added module-level cache variable `_true_variant_cache` +- Implemented lazy loading pattern +- Added proper error handling for missing files +- Used context manager for safe file handling + +**Benefits**: +- JSON file loaded only once per module import +- Significant performance improvement for repeated calls +- Proper resource management +- Thread-safe implementation + +## Recommendations for Future Improvements + +1. **Type Annotations**: Fix all type annotation issues across the codebase +2. **Article Text Caching**: Implement caching for article text loading +3. **Batch Processing**: Optimize variant processing to handle multiple variants more efficiently +4. **Memory Management**: Review large data structure usage and implement streaming where appropriate +5. **Database Integration**: Consider using a database instead of JSON files for better performance + +## Testing Recommendations + +1. Create performance benchmarks for the JSON loading optimization +2. Add unit tests for the caching mechanism +3. Implement integration tests to ensure functionality is preserved +4. Add memory usage monitoring for large dataset processing + +## Conclusion + +The most critical efficiency issue was the repeated JSON file loading in `get_true_variants()`. This fix provides immediate performance benefits with minimal risk. The type annotation issues should be addressed in a follow-up PR to improve code quality and maintainability. diff --git a/docs/prompts/study_types.txt b/docs/prompts/study_types.txt new file mode 100644 index 0000000..aedf029 --- /dev/null +++ b/docs/prompts/study_types.txt @@ -0,0 +1,38 @@ +GWAS: Genome-Wide Association Study; analyzes genetic variants across genomes to find associations with traits or diseases. +Case/control: Compares individuals with a condition (cases) to those without (controls) to identify associated factors. +Cohort: Observes a group over time to study incidence, causes, and prognosis of disease; can be prospective or retrospective. +Clinical trial: Interventional study where participants are assigned treatments and outcomes are measured. +Case series: Descriptive study tracking patients with a known exposure or treatment; no control group. +Cross sectional: Observational study measuring exposure and outcome simultaneously in a population. +Meta-analysis: Combines results from multiple studies to identify overall trends using statistical techniques. +Linkage: Genetic study mapping loci associated with traits by analyzing inheritance patterns in families. +Trios: Genetic study involving parent-offspring trios to identify de novo mutations. +Unknown: Unclassified or missing study type. + +Prospective: Study designed to follow subjects forward in time. +Retrospective: Uses existing records to look backward at exposures and outcomes. +Replication: Repeating a study to confirm findings. + +Composite examples: +Case/control, GWAS: A GWAS using a case/control design. +Clinical trial, GWAS: GWAS performed within a clinical trial. +Cohort, GWAS: GWAS performed within a cohort study. +Case/control, meta-analysis: Meta-analysis of case/control studies. +Cohort, meta-analysis: Meta-analysis of cohort studies. +Case/control, clinical trial: Clinical trial data analyzed using case/control logic. +Cohort, clinical trial: Cohort study derived from or embedded in a clinical trial. +Case/control, replication: Replication analysis within a case/control design. +Cohort, replication: Replication analysis using cohort data. +Clinical trial, replication: Replication of findings using clinical trial data. +Meta-analysis, GWAS: Meta-analysis combining GWAS data. +Cohort, prospective: Forward-looking cohort study. +Cohort, retrospective: Historical cohort study. +Prospective, retrospective: Studies using both forward-looking and retrospective components. +Case/control, prospective/retrospective: Case/control design with a time dimension. +Meta-analysis, replication: Meta-analysis focused on replicated findings. +Linkage, trios: Linkage analysis involving family trios. +Retrospective, linkage, trios: Combined design using retrospective data, linkage, and trios. +Case series, trios: Trio-based case series. +Cohort, case/control: Study combining cohort and case/control features. +Cohort, case/control, replication: Cohort-based case/control study with replication. +Clinical trial, meta-analysis, replication: Meta-analysis of clinical trials with replication. \ No newline at end of file diff --git a/pixi.lock b/pixi.lock index 83758a4..1f5bc07 100644 --- a/pixi.lock +++ b/pixi.lock @@ -4,6 +4,248 @@ environments: channels: - url: https://conda.anaconda.org/conda-forge/ packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.12.13-py312h178313f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.9.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.9.0-hbfa7f16_15.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.2-h5e3027f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.1-hafb2847_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.4-h76f0014_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.2-h015de20_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.20.1-hdfce8c9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.13.1-h1e5e6c0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.8.3-h5e174a9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-hafb2847_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.7-hafb2847_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.32.10-hff780f1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.510-h937e755_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-ha633028_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.4-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/biopython-1.85-py312h66e93f0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/black-25.1.0-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.6.15-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.6.15-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.2.1-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py312h68727a3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.11-py312hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datasets-3.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.14-py312h2ec8cdc_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dill-0.3.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distro-1.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.4-py312h178313f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.6.0-py312hb9e946c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gdown-5.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.1.5-py39h260a9e5_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.33.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh3099207_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.3.0-pyhfa0c392_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/jiter-0.10.0-py312h12e396e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.24.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.4.1-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.8.1-pyh31011fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.8-py312h84d6215_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h1423503_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20250127.1-cxx17_hbbce691_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-20.0.0-h1b9301b_8_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-20.0.0-hcb10f89_8_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-20.0.0-hcb10f89_8_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-20.0.0-h1bed206_8_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-32_h59b9bed_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-32_he106b2a_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.36.0-hc4361e1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.36.0-h0121fbd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.71.0-h8e591d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-32_h7ac8fdf_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.21.0-hd1b1c89_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.21.0-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-20.0.0-h081d1f1_8_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.49-h943b412_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.29.3-h501fc15_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.06.26-hba17884_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.1-h6cd9bfd_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.10.0-h202a827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/litellm-1.73.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/loguru-0.7.3-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.3-py312hd3ec401_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.6.0-py312h178313f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.16-py312h66e93f0_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h3f2d84a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nodejs-22.13.0-hf235a45_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.0-py312h6cf2f7f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/openai-1.93.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.1.2-h17f744e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.3.0-py312hf9745cd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.2.1-py312h80c1187_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/playwright-1.53.1-hbf95b10_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.51-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.3.1-py312h178313f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.0.0-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-20.0.0-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-20.0.0-py312h01725c0_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.11.7-pyh3cfb1c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.33.2-py312h680f630_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.11-h9e4cc4f_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.1.1-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.11-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-7_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.0.0-py312hbf22597_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.06.26-h9925aae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2024.11.6-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.25.1-py312h680f630_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.21-h7ab7c64_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py312ha707e6e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.4-py312hc0a28a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/termcolor-3.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tiktoken-0.9.0-py312h14ff09d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tokenizers-0.21.2-py312h8360d73_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.1-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.0-h32cad80_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.20.1-py312h178313f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h66e93f0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.6.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.12.7-py313ha9b7d5b_0.conda @@ -233,6 +475,35 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py313h90d716c_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + license: None + size: 2562 + timestamp: 1578324546067 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + license: BSD-3-Clause + license_family: BSD + size: 23621 + timestamp: 1650670423406 +- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + sha256: a3967b937b9abf0f2a99f3173fa4630293979bd1644709d89580e7c62a544661 + md5: aaa2a381ccc56eac91d63b6c1240312f + depends: + - cpython + - python-gil + license: MIT + license_family: MIT + size: 8191 + timestamp: 1744137672556 - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.6.1-pyhd8ed1ab_0.conda sha256: 7842ddc678e77868ba7b92a726b437575b23aaec293bca0d40826f1026d90e27 md5: 18fd895e0e775622906cdabfc3cf0fb4 @@ -242,6 +513,25 @@ packages: license_family: PSF size: 19750 timestamp: 1741775303303 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.12.13-py312h178313f_0.conda + sha256: 5b73f69c26a18236bd65bb48aafa53dbbd47b1f6ba41d7e4539440a849d6ca60 + md5: a91df3f6eaf0d0afd155274a1833ab3c + depends: + - __glibc >=2.17,<3.0.a0 + - aiohappyeyeballs >=2.5.0 + - aiosignal >=1.1.2 + - attrs >=17.3.0 + - frozenlist >=1.1.1 + - libgcc >=13 + - multidict >=4.5,<7.0 + - propcache >=0.2.0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - yarl >=1.17.0,<2.0 + license: MIT AND Apache-2.0 + license_family: Apache + size: 1003059 + timestamp: 1749925160150 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aiohttp-3.12.7-py313ha9b7d5b_0.conda sha256: c06e0060a8735dfb37904d791022d5866bbd02558b1973fb19e1c9b9d7bddb76 md5: 6a2d4bf13ef1cf70656c72a70939e169 @@ -327,6 +617,21 @@ packages: license_family: MIT size: 57181 timestamp: 1741918625732 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.9.0-hbfa7f16_15.conda + sha256: 85086df9b358450196a13fc55bab1c552227df78cafddbe2d15caaea458b41a6 + md5: 16baa9bb7f70a1e457a82023898314a7 + depends: + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - aws-c-io >=0.20.1,<0.20.2.0a0 + - aws-c-http >=0.10.2,<0.10.3.0a0 + - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 + - aws-c-common >=0.12.3,<0.12.4.0a0 + - aws-c-cal >=0.9.2,<0.9.3.0a0 + license: Apache-2.0 + license_family: APACHE + size: 122993 + timestamp: 1750291448852 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.9.0-heec1a4a_10.conda sha256: 9e6e463558ef031c11927cb42ab77ab411293320e4da2029b045e4bd87b25a2b md5: 3e0a9a2f08a8b969c28b8902c58fb4c7 @@ -341,6 +646,18 @@ packages: license_family: Apache size: 95181 timestamp: 1748308544897 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.2-h5e3027f_0.conda + sha256: d61cce967e6d97d03aa2828458f7344cdc93422fd2c1126976ab8f475a313363 + md5: 0ead3ab65460d51efb27e5186f50f8e4 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.12.3,<0.12.4.0a0 + - libgcc >=13 + - openssl >=3.5.0,<4.0a0 + license: Apache-2.0 + license_family: Apache + size: 51039 + timestamp: 1749095567725 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.1-h03444cf_0.conda sha256: 28d5dbe24487bbd331fef1bf5c44005fa20f7a3e5ac25ca4f2d2b22a1b69bd04 md5: 00f656788a70e7be0d2881bbf2884d74 @@ -351,6 +668,16 @@ packages: license_family: Apache size: 41318 timestamp: 1747827594213 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.3-hb9d3cd8_0.conda + sha256: 251883d45fbc3bc88a8290da073f54eb9d17e8b9edfa464d80cff1b948c571ec + md5: 8448031a22c697fac3ed98d69e8a9160 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: Apache-2.0 + license_family: Apache + size: 236494 + timestamp: 1747101172537 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.12.3-h5505292_0.conda sha256: c490463ade096f94e26c87096535f84822566b0f152d44cff9d6fef75b7d742e md5: ad04374e28a830d8ae898e471312dd9d @@ -360,6 +687,17 @@ packages: license_family: Apache size: 222023 timestamp: 1747101294224 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.1-hafb2847_5.conda + sha256: 68e7ec0ab4f5973343de089ac71c7b9b9387c35640c61e0236ad45fc3dbfaaaa + md5: e96cc668c0f9478f5771b37d57f90386 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - aws-c-common >=0.12.3,<0.12.4.0a0 + license: Apache-2.0 + license_family: APACHE + size: 21817 + timestamp: 1747144982788 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.1-hca07070_5.conda sha256: 18c0f643809e6a4899f7813ca04378c3f5928de31ef8187fd9f39bb858ebd552 md5: 7e1af001f57f107b6fe346cbd182265d @@ -370,6 +708,20 @@ packages: license_family: APACHE size: 21264 timestamp: 1747144987400 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.4-h76f0014_12.conda + sha256: 7b89ed99ac73c863bea4479f1f1af6ce250f9f1722d2804e07cf05d3630c7e08 + md5: f978f2a3032952350d0036c4c4a63bd6 + depends: + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - aws-c-io >=0.20.1,<0.20.2.0a0 + - aws-checksums >=0.2.7,<0.2.8.0a0 + - aws-c-common >=0.12.3,<0.12.4.0a0 + license: Apache-2.0 + license_family: APACHE + size: 57252 + timestamp: 1750287878861 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.4-hb369d5e_10.conda sha256: 032cbb86ce559e3dff4aee88982f12a06ef504f67edec0e922137d0aac7e4e48 md5: 80dd38afac915054562c409c8fdc2816 @@ -383,6 +735,20 @@ packages: license_family: APACHE size: 50693 timestamp: 1748301233715 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.2-h015de20_2.conda + sha256: ca0268cead19e985f9b153613f0f6cdb46e0ca32e1647466c506f256269bcdd9 + md5: ad05d594704926ba7c0c894a02ea98f1 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - aws-c-io >=0.20.1,<0.20.2.0a0 + - aws-c-common >=0.12.3,<0.12.4.0a0 + - aws-c-cal >=0.9.2,<0.9.3.0a0 + - aws-c-compression >=0.3.1,<0.3.2.0a0 + license: Apache-2.0 + license_family: APACHE + size: 223038 + timestamp: 1750289165728 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.1-hd6e4345_3.conda sha256: ca8ff98ffbd56eba06d5bb7781c58280ee4f2229ef82adf74e445dd543207542 md5: d0e048cfb51f74921d88c7892f338686 @@ -396,6 +762,19 @@ packages: license_family: APACHE size: 169353 timestamp: 1748302779435 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.20.1-hdfce8c9_0.conda + sha256: c6bd4f067a7829795e1c44e4536b71d46f55f69569216aed34a7b375815fa046 + md5: dd2d3530296d75023a19bc9dfb0a1d59 + depends: + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - s2n >=1.5.21,<1.5.22.0a0 + - aws-c-common >=0.12.3,<0.12.4.0a0 + - aws-c-cal >=0.9.2,<0.9.3.0a0 + license: Apache-2.0 + license_family: APACHE + size: 179223 + timestamp: 1749844480175 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.19.1-h465c264_2.conda sha256: d81451147bca57d59b8a3bb026bcf44a825656736f817a4cdb9bee5674e5b928 md5: 014c27c5cdae06584a8f4b268bd3bde3 @@ -407,6 +786,19 @@ packages: license_family: APACHE size: 175469 timestamp: 1748906517911 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.13.1-h1e5e6c0_3.conda + sha256: f9e63492d5dd17f361878ce7efa1878de27225216b4e07990a6cb18c378014dc + md5: d55921ca3469224f689f974278107308 + depends: + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - aws-c-http >=0.10.2,<0.10.3.0a0 + - aws-c-io >=0.20.1,<0.20.2.0a0 + - aws-c-common >=0.12.3,<0.12.4.0a0 + license: Apache-2.0 + license_family: APACHE + size: 215867 + timestamp: 1750291920145 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.13.1-h8e407d2_0.conda sha256: 50cf08b634d6c4a9728f0d385b971361ee0403c800e12e4aa64e3731d7aa5099 md5: fbcaced26424a20639c4ff89daae2733 @@ -419,6 +811,22 @@ packages: license_family: APACHE size: 149844 timestamp: 1748369766500 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.8.3-h5e174a9_0.conda + sha256: f4e7b200da5df7135cd087618fa30b2cd60cec0eebbd5570fb4c1e9a789dd9aa + md5: dea2540e57e8c1b949ca58ff4c7c0cbf + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - aws-c-io >=0.20.1,<0.20.2.0a0 + - openssl >=3.5.0,<4.0a0 + - aws-c-auth >=0.9.0,<0.9.1.0a0 + - aws-c-http >=0.10.2,<0.10.3.0a0 + - aws-checksums >=0.2.7,<0.2.8.0a0 + - aws-c-common >=0.12.3,<0.12.4.0a0 + - aws-c-cal >=0.9.2,<0.9.3.0a0 + license: Apache-2.0 + size: 133960 + timestamp: 1750831815089 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.8.0-h0bc1dd9_1.conda sha256: 993f48c3b786995fd10a207ab5319b2791bf7cad0de73c6ea60bbedcdfd8fbda md5: 1bb0fd32216a9406bfaebc39ded18c4a @@ -434,6 +842,17 @@ packages: license_family: APACHE size: 116445 timestamp: 1748316625713 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-hafb2847_0.conda + sha256: 18c588c386e21e2a926c6f3c1ba7aaf69059ce1459a134f7c8c1ebfc68cf67ec + md5: 65853df44b7e4029d978c50be888ed89 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - aws-c-common >=0.12.3,<0.12.4.0a0 + license: Apache-2.0 + license_family: APACHE + size: 59037 + timestamp: 1747308292628 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.4-hca07070_0.conda sha256: c3894aa15c624e2a558602ef28c89d3802371edd27641f3117555297bcbf486b md5: d4557403e04d0f260064e7230ba8de4b @@ -444,6 +863,17 @@ packages: license_family: APACHE size: 53372 timestamp: 1747308310688 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.7-hafb2847_1.conda + sha256: 03a5e4b3dcda35696133632273043d0b81e55129ff0f9e6d75483aa8eb96371b + md5: 6d28d50637fac4f081a0903b4b33d56d + depends: + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.12.3,<0.12.4.0a0 + license: Apache-2.0 + license_family: APACHE + size: 76627 + timestamp: 1747141741534 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.7-hca07070_1.conda sha256: 1655a02433bfe60cf9ecde6eac1270ed52fafe1f0beb904e92a9d456bcb0abd3 md5: fe9324b2c11c53dec1ef7a2790b3163b @@ -454,6 +884,25 @@ packages: license_family: APACHE size: 74064 timestamp: 1747141754096 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.32.10-hff780f1_1.conda + sha256: 9602a5199dccf257709afdef326abfde6e84c63862b7cee59979803c4d636840 + md5: 843f52366658086c4f0b0654afbf3730 + depends: + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=13 + - libgcc >=13 + - aws-c-mqtt >=0.13.1,<0.13.2.0a0 + - aws-c-event-stream >=0.5.4,<0.5.5.0a0 + - aws-c-auth >=0.9.0,<0.9.1.0a0 + - aws-c-s3 >=0.8.3,<0.8.4.0a0 + - aws-c-http >=0.10.2,<0.10.3.0a0 + - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 + - aws-c-cal >=0.9.2,<0.9.3.0a0 + - aws-c-common >=0.12.3,<0.12.4.0a0 + - aws-c-io >=0.20.1,<0.20.2.0a0 + license: Apache-2.0 + size: 399987 + timestamp: 1750855462459 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.32.8-hd1dc5eb_1.conda sha256: 58774848cf256b4abb448a6afa6298f683d93bd840dd7f76866804ff1eddbaaa md5: fbb787c98557c473e71cbe6abe5b0a2c @@ -473,6 +922,21 @@ packages: license_family: APACHE size: 262402 timestamp: 1748906019271 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.510-h937e755_12.conda + sha256: 8fa640da0d7223c3d120e8d222d4b4cb519f05b628f60764192d08a937229cec + md5: f4e09870ecaceb4594574e515bb04747 + depends: + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libcurl >=8.14.1,<9.0a0 + - aws-c-common >=0.12.3,<0.12.4.0a0 + - aws-c-event-stream >=0.5.4,<0.5.5.0a0 + - aws-crt-cpp >=0.32.10,<0.32.11.0a0 + - libzlib >=1.3.1,<2.0a0 + license: Apache-2.0 + size: 3401464 + timestamp: 1751089137364 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.510-h8888cfc_10.conda sha256: 9aca5277166788ee031734e97c5a387b2d20ef9d59c09999ef36e506238bc26e md5: 0a2f62e9c3d554a5807fb7311bb4d8b0 @@ -488,6 +952,19 @@ packages: license_family: APACHE size: 3066219 timestamp: 1748938924094 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.14.0-h5cfcd09_0.conda + sha256: fe07debdb089a3db17f40a7f20d283d75284bb4fc269ef727b8ba6fc93f7cb5a + md5: 0a8838771cc2e985cd295e01ae83baf1 + depends: + - __glibc >=2.17,<3.0.a0 + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + license: MIT + license_family: MIT + size: 345117 + timestamp: 1728053909574 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.14.0-hd50102c_0.conda sha256: f5b91329ed59ffc0be8747784c6e4cc7e56250c54032883a83bc11808ef6a87e md5: f093a11dcf3cdcca010b20a818fcc6dc @@ -500,6 +977,19 @@ packages: license_family: MIT size: 294299 timestamp: 1728054014060 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.10.0-h113e628_0.conda + sha256: 286b31616c191486626cb49e9ceb5920d29394b9e913c23adb7eb637629ba4de + md5: 73f73f60854f325a55f1d31459f2ab73 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.3.2,<4.0a0 + license: MIT + license_family: MIT + size: 232351 + timestamp: 1728486729511 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.10.0-hc602bab_0.conda sha256: bde446b916fff5150606f8ed3e6058ffc55a3aa72381e46f1ab346590b1ae40a md5: d7b71593a937459f2d4b67e1a4727dc2 @@ -512,6 +1002,19 @@ packages: license_family: MIT size: 166907 timestamp: 1728486882502 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.13.0-h3cf044e_1.conda + sha256: 2606260e5379eed255bcdc6adc39b93fb31477337bcd911c121fc43cd29bf394 + md5: 7eb66060455c7a47d9dcdbfa9f46579b + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + license: MIT + license_family: MIT + size: 549342 + timestamp: 1728578123088 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.13.0-h7585a09_1.conda sha256: 08d52d130addc0fb55d5ba10d9fa483e39be25d69bac7f4c676c2c3069207590 md5: 704238ef05d46144dae2e6b5853df8bc @@ -524,6 +1027,20 @@ packages: license_family: MIT size: 438636 timestamp: 1728578216193 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.8.0-h736e048_1.conda + sha256: 273475f002b091b66ce7366da04bf164c3732c03f8692ab2ee2d23335b6a82ba + md5: 13de36be8de3ae3f05ba127631599213 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.12.7,<2.14.0a0 + - openssl >=3.3.2,<4.0a0 + license: MIT + license_family: MIT + size: 149312 + timestamp: 1728563338704 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.8.0-h9ca1f76_1.conda sha256: 77ab04e8fe5636a2de9c718f72a43645f7502cd208868c8a91ffba385547d585 md5: 7a187cd7b1445afc80253bb186a607cc @@ -537,6 +1054,20 @@ packages: license_family: MIT size: 121278 timestamp: 1728563418777 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.12.0-ha633028_1.conda + sha256: 5371e4f3f920933bb89b926a85a67f24388227419abd6e99f6086481e5e8d5f2 + md5: 7c1980f89dd41b097549782121a73490 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libgcc >=13 + - libstdcxx >=13 + license: MIT + license_family: MIT + size: 287366 + timestamp: 1728729530295 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.12.0-hcdd55da_1.conda sha256: f48523f8aa0b5b80f45a92f0556b388dd96f44ac2dc2f44a01d08c1822eec97d md5: c49fbc5233fcbaa86391162ff1adef38 @@ -561,6 +1092,18 @@ packages: license_family: MIT size: 146613 timestamp: 1744783307123 +- conda: https://conda.anaconda.org/conda-forge/linux-64/biopython-1.85-py312h66e93f0_1.conda + sha256: 811aadba96f8f1cd2c57eb31bf58919d544ceb81e55126ac15b657fa2cd23ed0 + md5: 1d1f8838e26ff73784990e7ca8e4b9a5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - numpy + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: LicenseRef-Biopython + size: 3476893 + timestamp: 1737241855271 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/biopython-1.85-py313h90d716c_1.conda sha256: d403f32ee3211ce079985ab4b6446fbd44c315ca310985b6407fc7563db1c3fb md5: 97a048b1d8ddc97ebe4d0446cb00bc48 @@ -573,6 +1116,21 @@ packages: license: LicenseRef-Biopython size: 3482482 timestamp: 1737241952569 +- conda: https://conda.anaconda.org/conda-forge/linux-64/black-25.1.0-py312h7900ff3_0.conda + sha256: a115a0984455ee031ac90fc533ab719fd5f5e3803930ccf0a934fb7416d568ef + md5: 986a60de52eec10b36c61bb3890858ff + depends: + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9 + - platformdirs >=2 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + size: 394760 + timestamp: 1738616131766 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/black-25.1.0-py313h8f79df9_0.conda sha256: ef2f742f6abefc32506038a4c64bf0c086c8e13234c1fe80c8675c7f92589cc2 md5: 698e6c77b39a4f3d82c8e2e7d82b81c8 @@ -589,6 +1147,19 @@ packages: license_family: MIT size: 400095 timestamp: 1738616517582 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda + sha256: c969baaa5d7a21afb5ed4b8dd830f82b78e425caaa13d717766ed07a61630bec + md5: 5d08a0ac29e6a5a984817584775d4131 + depends: + - __glibc >=2.17,<3.0.a0 + - brotli-bin 1.1.0 hb9d3cd8_3 + - libbrotlidec 1.1.0 hb9d3cd8_3 + - libbrotlienc 1.1.0 hb9d3cd8_3 + - libgcc >=13 + license: MIT + license_family: MIT + size: 19810 + timestamp: 1749230148642 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.1.0-hd74edd7_2.conda sha256: a086f36ff68d6e30da625e910547f6211385246fb2474b144ac8c47c32254576 md5: 215e3dc8f2f837906d066e7f01aa77c0 @@ -601,6 +1172,18 @@ packages: license_family: MIT size: 19588 timestamp: 1725268044856 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_3.conda + sha256: ab74fa8c3d1ca0a055226be89e99d6798c65053e2d2d3c6cb380c574972cd4a7 + md5: 58178ef8ba927229fba6d84abf62c108 + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlidec 1.1.0 hb9d3cd8_3 + - libbrotlienc 1.1.0 hb9d3cd8_3 + - libgcc >=13 + license: MIT + license_family: MIT + size: 19390 + timestamp: 1749230137037 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.1.0-hd74edd7_2.conda sha256: 28f1af63b49fddf58084fb94e5512ad46e9c453eb4be1d97449c67059e5b0680 md5: b8512db2145dc3ae8d86cdc21a8d421e @@ -612,6 +1195,21 @@ packages: license_family: MIT size: 16772 timestamp: 1725268026061 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_3.conda + sha256: dc27c58dc717b456eee2d57d8bc71df3f562ee49368a2351103bc8f1b67da251 + md5: a32e0c069f6c3dcac635f7b0b0dac67e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.1.0 hb9d3cd8_3 + license: MIT + license_family: MIT + size: 351721 + timestamp: 1749230265727 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py313h3579c5c_2.conda sha256: b0a66572f44570ee7cc960e223ca8600d26bb20cfb76f16b95adf13ec4ee3362 md5: f3bee63c7b5d041d841aff05785c28b7 @@ -627,6 +1225,16 @@ packages: license_family: MIT size: 339067 timestamp: 1725268603536 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + license: bzip2-1.0.6 + license_family: BSD + size: 252783 + timestamp: 1720974456583 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab @@ -636,6 +1244,16 @@ packages: license_family: BSD size: 122909 timestamp: 1720974522888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda + sha256: f8003bef369f57396593ccd03d08a8e21966157269426f71e943f96e4b579aeb + md5: f7f0d6cc2dc986d42ac2689ec88192be + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 206884 + timestamp: 1744127994291 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.5-h5505292_0.conda sha256: b4bb55d0806e41ffef94d0e3f3c97531f322b3cb0ca1f7cdf8e47f62538b7a2b md5: f8cd1beb98240c7edb1a95883360ccfa @@ -653,6 +1271,14 @@ packages: license: ISC size: 152283 timestamp: 1745653616541 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.6.15-hbd8a1cb_0.conda + sha256: 7cfec9804c84844ea544d98bda1d9121672b66ff7149141b8415ca42dfcd44f6 + md5: 72525f07d72806e3b639ad4504c30ce5 + depends: + - __unix + license: ISC + size: 151069 + timestamp: 1749990087500 - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda sha256: 42a78446da06a2568cb13e69be3355169fbd0ea424b00fc80b7d840f5baaacf3 md5: c207fa5ac7ea99b149344385a9c0880d @@ -661,6 +1287,28 @@ packages: license: ISC size: 162721 timestamp: 1739515973129 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.6.15-pyhd8ed1ab_0.conda + sha256: d71c85835813072cd6d7ce4b24be34215cd90c104785b15a5d58f4cd0cb50778 + md5: 781d068df0cc2407d4db0ecfbb29225b + depends: + - python >=3.9 + license: ISC + size: 155377 + timestamp: 1749972291158 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda + sha256: cba6ea83c4b0b4f5b5dc59cb19830519b28f95d7ebef7c9c5cf1c14843621457 + md5: a861504bbea4161a9170b85d4d2be840 + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - pycparser + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + size: 294403 + timestamp: 1725560714366 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py313hc845a76_0.conda sha256: 50650dfa70ccf12b9c4a117d7ef0b41895815bb7328d830d667a6ba3525b60e8 md5: 6d24d5587a8615db33c961a4ca0a8034 @@ -684,6 +1332,15 @@ packages: license_family: MIT size: 47438 timestamp: 1735929811779 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda + sha256: 535ae5dcda8022e31c6dc063eb344c80804c537a5a04afba43a845fa6fa130f5 + md5: 40fe4284b8b5835a9073a645139f35af + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 50481 + timestamp: 1746214981991 - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda sha256: c920d23cd1fcf565031c679adb62d848af60d6fbb0edc2d50ba475cea4f0d8ab md5: f22f4d4970e09d68a10b922cbb0408d3 @@ -694,6 +1351,16 @@ packages: license_family: BSD size: 84705 timestamp: 1734858922844 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.2.1-pyh707e725_0.conda + sha256: 8aee789c82d8fdd997840c952a586db63c6890b00e88c4fb6e80a38edd5f51c0 + md5: 94b550b8d3a614dbd326af798c7dfb40 + depends: + - __unix + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + size: 87749 + timestamp: 1747811451319 - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 md5: 962b9857ee8e7018c22f2776ffa0b2d7 @@ -713,6 +1380,20 @@ packages: license_family: BSD size: 12103 timestamp: 1733503053903 +- conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py312h68727a3_0.conda + sha256: 4c8f2aa34aa031229e6f8aa18f146bce7987e26eae9c6503053722a8695ebf0c + md5: e688276449452cdfe9f8f5d3e74c23f6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.23 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + size: 276533 + timestamp: 1744743235779 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.2-py313h0ebd0e5_0.conda sha256: 77f98527cc01d0560f5b49115d8f7322acf67107e746f7d233e9af189ae0444f md5: e8839c4b3d19a8137e2ab480765e874b @@ -727,6 +1408,16 @@ packages: license_family: BSD size: 247420 timestamp: 1744743362236 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.11-py312hd8ed1ab_0.conda + noarch: generic + sha256: 7e7bc8e73a2f3736444a8564cbece7216464c00f0bc38e604b0c792ff60d621a + md5: e5279009e7a7f7edd3cd2880c502b3cc + depends: + - python >=3.12,<3.13.0a0 + - python_abi * *_cp312 + license: Python-2.0 + size: 45852 + timestamp: 1749047748072 - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda sha256: 9827efa891e507a91a8a2acf64e210d2aff394e1cde432ad08e1f8c66b12293c md5: 44600c4667a319d67dbe0681fc0bc833 @@ -759,6 +1450,19 @@ packages: license_family: Apache size: 338869 timestamp: 1746740579822 +- conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.14-py312h2ec8cdc_0.conda + sha256: 8f0b338687f79ea87324f067bedddd2168f07b8eec234f0fe63b522344c6a919 + md5: 089cf3a3becf0e2f403feaf16e921678 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + size: 2630748 + timestamp: 1744321406939 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.14-py313h928ef07_0.conda sha256: e1fef24f7d220dd77522f06598d2c8c5b6ca68123f06515436c57a8777871481 md5: 6521542d1c40d124657586810f220571 @@ -807,6 +1511,15 @@ packages: license: MIT and PSF-2.0 size: 20486 timestamp: 1733208916977 +- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + sha256: ce61f4f99401a4bd455b89909153b40b9c823276aefcbb06f2044618696009ca + md5: 72e42d28960d875c7654614f8b50939a + depends: + - python >=3.9 + - typing_extensions >=4.6.0 + license: MIT and PSF-2.0 + size: 21284 + timestamp: 1746947398083 - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.0-pyhd8ed1ab_0.conda sha256: 7510dd93b9848c6257c43fdf9ad22adf62e7aa6da5f12a6a757aed83bcfedf05 md5: 81d30c08f9a3e556e8ca9e124b044d14 @@ -824,6 +1537,21 @@ packages: license: Unlicense size: 17887 timestamp: 1741969612334 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.4-py312h178313f_0.conda + sha256: aa29952ac29ab4c4dad091794513241c1f732c55c58ba109f02550bc83081dc9 + md5: 223a4616e3db7336569eafefac04ebbf + depends: + - __glibc >=2.17,<3.0.a0 + - brotli + - libgcc >=13 + - munkres + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - unicodedata2 >=15.1.0 + license: MIT + license_family: MIT + size: 2864513 + timestamp: 1749848613494 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.57.0-py313ha9b7d5b_0.conda sha256: 4cf84b94c810e3802ae27e40f7e7166ff8ff428507e9f44a245609e654692a4c md5: 789f1322ec25f3ebc370e0d18bc12668 @@ -838,6 +1566,15 @@ packages: license_family: MIT size: 2802226 timestamp: 1743732535385 +- conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda + sha256: 7ef7d477c43c12a5b4cddcf048a83277414512d1116aba62ebadfa7056a7d84f + md5: 9ccd736d31e0c6e41f54e704e5312811 + depends: + - libfreetype 2.13.3 ha770c72_1 + - libfreetype6 2.13.3 h48d6fc4_1 + license: GPL-2.0-only OR FTL + size: 172450 + timestamp: 1745369996765 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.13.3-hce30654_1.conda sha256: 6b63c72ea51a41d41964841404564c0729fdddd3e952e2715839fd759b7cfdfc md5: e684de4644067f1956a580097502bf03 @@ -847,6 +1584,19 @@ packages: license: GPL-2.0-only OR FTL size: 172220 timestamp: 1745370149658 +- conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.6.0-py312hb9e946c_0.conda + sha256: 685ef959d9f3ceeb2bd0dbda36b4bdcfb6e3ae7d1a7cc2c364de543cc28c597f + md5: 13290e5d9cb327b1b61c1bd8089ac920 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: APACHE + size: 113391 + timestamp: 1746635510382 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/frozenlist-1.6.0-py313h857e90f_0.conda sha256: 5f333962168ba7f51a99eb57742531696192d323f44c3e52d78580d7d2448d64 md5: 7fcbc68f821469f804c68100dba97f97 @@ -882,6 +1632,17 @@ packages: license_family: MIT size: 21891 timestamp: 1734276919955 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda + sha256: 6c33bf0c4d8f418546ba9c250db4e4221040936aef8956353bc764d4877bc39a + md5: d411fc29e338efb48c5fd4576d71d881 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: BSD-3-Clause + license_family: BSD + size: 119654 + timestamp: 1726600001928 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda sha256: fd56ed8a1dab72ab90d8a8929b6f916a6d9220ca297ff077f8f04c5ed3408e20 md5: 57a511a5905caa37540eb914dfcbf1fb @@ -892,6 +1653,17 @@ packages: license_family: BSD size: 82090 timestamp: 1726600145480 +- conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda + sha256: dc824dc1d0aa358e28da2ecbbb9f03d932d976c8dca11214aa1dcdfcbd054ba2 + md5: ff862eebdfeb2fd048ae9dc92510baca + depends: + - gflags >=2.2.2,<2.3.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: BSD-3-Clause + license_family: BSD + size: 143452 + timestamp: 1718284177264 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-heb240a5_0.conda sha256: 9fc77de416953aa959039db72bc41bfa4600ae3ff84acad04a7d0c1ab9552602 md5: fef68d0a95aa5b84b5c1a4f6f3bf40e1 @@ -924,6 +1696,23 @@ packages: license_family: MIT size: 53888 timestamp: 1738578623567 +- conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.1.5-py39h260a9e5_3.conda + noarch: python + sha256: b28905ff975bd935cd113ee97b7eb5b5e3b0969a21302135c6ae096aa06a61f6 + md5: 7b6007f4ad18a970ca3a977148cf47de + depends: + - python + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - openssl >=3.5.0,<4.0a0 + - _python_abi3_support 1.* + - cpython >=3.9 + constrains: + - __glibc >=2.17 + license: Apache-2.0 + license_family: APACHE + size: 2537615 + timestamp: 1750541218448 - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba md5: 0a802cb9888dd14eeefc611f05c40b6e @@ -978,6 +1767,23 @@ packages: license_family: APACHE size: 302452 timestamp: 1747670941134 +- conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.33.1-pyhd8ed1ab_0.conda + sha256: bdbfb0a2aa957fc2a79dc342022529def69162825d6420f03b2dcfaab92765a2 + md5: 4a634f9e9ad0e28ecd4da031a4616d03 + depends: + - filelock + - fsspec >=2023.5.0 + - hf-xet >=1.1.2,<2.0.0 + - packaging >=20.9 + - python >=3.9 + - pyyaml >=5.1 + - requests + - tqdm >=4.42.1 + - typing-extensions >=3.7.4.3 + - typing_extensions >=3.7.4.3 + license: Apache-2.0 + size: 317782 + timestamp: 1750865913736 - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 md5: 8e6923fc12f1fe8f8c4e5c9f343256ac @@ -987,6 +1793,17 @@ packages: license_family: MIT size: 17397 timestamp: 1737618427549 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e + md5: 8b189310083baabfb622af68fd9d3ae3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: MIT + license_family: MIT + size: 12129203 + timestamp: 1720853576813 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda sha256: 9ba12c93406f3df5ab0a43db8a4b4ef67a5871dfd401010fbe29b218b2cbe620 md5: 5eb22c1d7b3fc4abb50d92d621583137 @@ -1015,18 +1832,51 @@ packages: license_family: APACHE size: 29141 timestamp: 1737420302391 -- conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda - sha256: acc1d991837c0afb67c75b77fdc72b4bf022aac71fedd8b9ea45918ac9b08a80 - md5: c85c76dc67d75619a92f51dfbce06992 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + sha256: c18ab120a0613ada4391b15981d86ff777b5690ca461ea7e9e49531e8f374745 + md5: 63ccfdc3a3ce25b027b8767eb722fca8 depends: - python >=3.9 - - zipp >=3.1.0 + - zipp >=3.20 + - python + license: Apache-2.0 + license_family: APACHE + size: 34641 + timestamp: 1747934053147 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + sha256: acc1d991837c0afb67c75b77fdc72b4bf022aac71fedd8b9ea45918ac9b08a80 + md5: c85c76dc67d75619a92f51dfbce06992 + depends: + - python >=3.9 + - zipp >=3.1.0 constrains: - importlib-resources >=6.5.2,<6.5.3.0a0 license: Apache-2.0 license_family: APACHE size: 33781 timestamp: 1736252433366 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh3099207_0.conda + sha256: 33cfd339bb4efac56edf93474b37ddc049e08b1b4930cf036c893cc1f5a1f32a + md5: b40131ab6a36ac2c09b7c57d4d3fbf99 + depends: + - __linux + - comm >=0.1.1 + - debugpy >=1.6.5 + - ipython >=7.23.1 + - jupyter_client >=6.1.12 + - jupyter_core >=4.12,!=5.0.* + - matplotlib-inline >=0.1 + - nest-asyncio + - packaging + - psutil + - python >=3.8 + - pyzmq >=24 + - tornado >=6.1 + - traitlets >=5.4.0 + license: BSD-3-Clause + license_family: BSD + size: 119084 + timestamp: 1719845605084 - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh57ce528_0.conda sha256: 072534d4d379225b2c3a4e38bc7730b65ae171ac7f0c2d401141043336e97980 md5: 9eb15d654daa0ef5a98802f586bb4ffc @@ -1073,6 +1923,29 @@ packages: license_family: BSD size: 620691 timestamp: 1745672166398 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.3.0-pyhfa0c392_0.conda + sha256: ee5d526cba0c0a5981cbcbcadc37a76d257627a904ed2cd2db45821735c93ebd + md5: 270dbfb30fe759b39ce0c9fdbcd7be10 + depends: + - __unix + - pexpect >4.3 + - decorator + - exceptiongroup + - ipython_pygments_lexers + - jedi >=0.16 + - matplotlib-inline + - pickleshare + - prompt-toolkit >=3.0.41,<3.1.0 + - pygments >=2.4.0 + - python >=3.11 + - stack_data + - traitlets >=5.13.0 + - typing_extensions >=4.6 + - python + license: BSD-3-Clause + license_family: BSD + size: 621859 + timestamp: 1748713870748 - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda sha256: 894682a42a7d659ae12878dbcb274516a7031bbea9104e92f8e88c1f2765a104 md5: bd80ba060603cc228d9d81c257093119 @@ -1102,6 +1975,20 @@ packages: license_family: BSD size: 112714 timestamp: 1741263433881 +- conda: https://conda.anaconda.org/conda-forge/linux-64/jiter-0.10.0-py312h12e396e_0.conda + sha256: 2d08c42c347fe32b4ec03c5c803a641812d65711b43a32a820cd13d9d1984d86 + md5: a3f7a6978a83ba7ae8d68bbd336e731b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + size: 309543 + timestamp: 1747609999738 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jiter-0.9.0-py313hdde674f_0.conda sha256: 443359306f17dd94b6d78438cf864999bfbaabe3f6ba8374309dafd372e45571 md5: dcdacfc1a200c74dd2f64266782c4130 @@ -1169,6 +2056,39 @@ packages: license_family: BSD size: 57671 timestamp: 1727163547058 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.8.1-pyh31011fe_0.conda + sha256: 56a7a7e907f15cca8c4f9b0c99488276d4cb10821d2d15df9245662184872e81 + md5: b7d89d860ebcda28a5303526cdee68ab + depends: + - __unix + - platformdirs >=2.5 + - python >=3.8 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 59562 + timestamp: 1748333186063 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb + md5: 30186d27e2c9fa62b45fb1476b7200e3 + depends: + - libgcc-ng >=10.3.0 + license: LGPL-2.1-or-later + size: 117831 + timestamp: 1646151697040 +- conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.8-py312h84d6215_0.conda + sha256: 3ce99d721c1543f6f8f5155e53eef11be47b2f5942a8d1060de6854f9d51f246 + md5: 6713467dc95509683bfa3aca08524e8a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + size: 71649 + timestamp: 1736908364705 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.4.7-py313hf9c7212_0.conda sha256: 14a53c1dbe9eef23cd65956753de8f6c5beb282808b7780d79af0a286ba3eee9 md5: 830d9777f1c5f26ebb4286775f95658a @@ -1182,6 +2102,20 @@ packages: license_family: BSD size: 61424 timestamp: 1725459552592 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + license: MIT + license_family: MIT + size: 1370023 + timestamp: 1719463201255 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b md5: c6dc8a0fdec13a0565936655c33069a1 @@ -1195,6 +2129,18 @@ packages: license_family: MIT size: 1155530 timestamp: 1719463474401 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda + sha256: d6a61830a354da022eae93fa896d0991385a875c6bba53c82263a289deda9db8 + md5: 000e85703f0fd9594c81710dd5066471 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + license: MIT + license_family: MIT + size: 248046 + timestamp: 1739160907615 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.17-h7eeda09_0.conda sha256: 310a62c2f074ebd5aa43b3cd4b00d46385ce680fa2132ecee255a200e2d2f15f md5: 92a61fd30b19ebd5c1621a5bfe6d8b5f @@ -1206,6 +2152,28 @@ packages: license_family: MIT size: 212125 timestamp: 1739161108467 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h1423503_5.conda + sha256: dcd2b1a065bbf5c54004ddf6551c775a8eb6993c8298ca8a6b92041ed413f785 + md5: 6dc9e1305e7d3129af4ad0dabda30e56 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.43 + license: GPL-3.0-only + license_family: GPL + size: 670635 + timestamp: 1749858327854 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda + sha256: 412381a43d5ff9bbed82cd52a0bbca5b90623f62e41007c9c42d3870c60945ff + md5: 9344155d33912347b37f0ae6c410a835 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: Apache-2.0 + license_family: Apache + size: 264243 + timestamp: 1745264221534 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-hd64df32_1.conda sha256: 12361697f8ffc9968907d1a7b5830e34c670e4a59b638117a2cdfed8f63a38f8 md5: a74332d9b60b62905e3d30709df08bf1 @@ -1216,6 +2184,20 @@ packages: license_family: Apache size: 188306 timestamp: 1745264362794 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20250127.1-cxx17_hbbce691_0.conda + sha256: 65d5ca837c3ee67b9d769125c21dc857194d7f6181bb0e7bd98ae58597b457d0 + md5: 00290e549c5c8a32cc271020acc9ec6b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - abseil-cpp =20250127.1 + - libabseil-static =20250127.1=cxx17* + license: Apache-2.0 + license_family: Apache + size: 1325007 + timestamp: 1742369558286 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20250127.1-cxx17_h07bc746_0.conda sha256: 9884f855bdfd5cddac209df90bdddae8b3a6d8accfd2d3f52bc9db2f9ebb69c9 md5: 26aabb99a8c2806d8f617fd135f2fc6f @@ -1229,6 +2211,45 @@ packages: license_family: Apache size: 1192962 timestamp: 1742369814061 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-20.0.0-h1b9301b_8_cpu.conda + build_number: 8 + sha256: e218ae6165e6243d8850352640cee57f06a8d05743647918a0370cc5fcc8b602 + md5: 31fc3235e7c84fe61575041cad3756a8 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-crt-cpp >=0.32.10,<0.32.11.0a0 + - aws-sdk-cpp >=1.11.510,<1.11.511.0a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-identity-cpp >=1.10.0,<1.10.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20250127.1,<20250128.0a0 + - libbrotlidec >=1.1.0,<1.2.0a0 + - libbrotlienc >=1.1.0,<1.2.0a0 + - libgcc >=13 + - libgoogle-cloud >=2.36.0,<2.37.0a0 + - libgoogle-cloud-storage >=2.36.0,<2.37.0a0 + - libopentelemetry-cpp >=1.21.0,<1.22.0a0 + - libprotobuf >=5.29.3,<5.29.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libutf8proc >=2.10.0,<2.11.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.1.2,<2.1.3.0a0 + - re2 + - snappy >=1.2.1,<1.3.0a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - parquet-cpp <0.0a0 + - arrow-cpp <0.0a0 + - apache-arrow-proc =*=cpu + license: Apache-2.0 + size: 9203820 + timestamp: 1750865083349 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-20.0.0-h76b72fb_6_cpu.conda build_number: 6 sha256: c66211cfd0166deada6679f3a5db43abae5a95b817d93f43e4e8c155616c2cec @@ -1267,6 +2288,18 @@ packages: license: Apache-2.0 size: 5709475 timestamp: 1748961025060 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-20.0.0-hcb10f89_8_cpu.conda + build_number: 8 + sha256: 7be0682610864ec3866214b935c9bf8adeda2615e9a663e3bf4fe57ef203fa2d + md5: a9d337e1f407c5d92e609cb39c803343 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 20.0.0 h1b9301b_8_cpu + - libgcc >=13 + - libstdcxx >=13 + license: Apache-2.0 + size: 642522 + timestamp: 1750865165581 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-20.0.0-hf07054f_6_cpu.conda build_number: 6 sha256: be24d16039126dea739979de00b87ddef275bae5efcb81fa04ea2dc86971d923 @@ -1278,6 +2311,20 @@ packages: license: Apache-2.0 size: 503204 timestamp: 1748961151278 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-20.0.0-hcb10f89_8_cpu.conda + build_number: 8 + sha256: 23f6a1dc75e8d12478aa683640169ac14baaeb086d1f0ed5bfe96a562a3c5bab + md5: 14bb8eeeff090f873056fa629d2d82b5 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 20.0.0 h1b9301b_8_cpu + - libarrow-acero 20.0.0 hcb10f89_8_cpu + - libgcc >=13 + - libparquet 20.0.0 h081d1f1_8_cpu + - libstdcxx >=13 + license: Apache-2.0 + size: 607588 + timestamp: 1750865314449 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-20.0.0-hf07054f_6_cpu.conda build_number: 6 sha256: 3ad075f198a87c7d568d73adbd18939fdcc923975655eb0d3d213ea5590c6efb @@ -1291,6 +2338,23 @@ packages: license: Apache-2.0 size: 503418 timestamp: 1748961329741 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-20.0.0-h1bed206_8_cpu.conda + build_number: 8 + sha256: 04f214b1f6d5b35fa89a17cce43f5c321167038d409d1775d7457015c6a26cba + md5: 8a98f2bf0cf61725f8842ec45dbd7986 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20250127.1,<20250128.0a0 + - libarrow 20.0.0 h1b9301b_8_cpu + - libarrow-acero 20.0.0 hcb10f89_8_cpu + - libarrow-dataset 20.0.0 hcb10f89_8_cpu + - libgcc >=13 + - libprotobuf >=5.29.3,<5.29.4.0a0 + - libstdcxx >=13 + license: Apache-2.0 + size: 525599 + timestamp: 1750865405214 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-20.0.0-he749cb8_6_cpu.conda build_number: 6 sha256: 62e241b7e6a81c1c4418d391907903fed1b89da8cd93f6f6ee6f9c4066630db9 @@ -1307,6 +2371,23 @@ packages: license: Apache-2.0 size: 451088 timestamp: 1748961469582 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-32_h59b9bed_openblas.conda + build_number: 32 + sha256: 1540bf739feb446ff71163923e7f044e867d163c50b605c8b421c55ff39aa338 + md5: 2af9f3d5c2e39f417ce040f5a35c40c6 + depends: + - libopenblas >=0.3.30,<0.3.31.0a0 + - libopenblas >=0.3.30,<1.0a0 + constrains: + - libcblas 3.9.0 32*_openblas + - mkl <2025 + - liblapacke 3.9.0 32*_openblas + - blas 2.132 openblas + - liblapack 3.9.0 32*_openblas + license: BSD-3-Clause + license_family: BSD + size: 17330 + timestamp: 1750388798074 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-31_h10e41b3_openblas.conda build_number: 31 sha256: 369586e7688b59b4f92c709b99d847d66d4d095425db327dd32ee5e6ab74697f @@ -1324,6 +2405,16 @@ packages: license_family: BSD size: 17123 timestamp: 1740088119350 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_3.conda + sha256: 462a8ed6a7bb9c5af829ec4b90aab322f8bcd9d8987f793e6986ea873bbd05cf + md5: cb98af5db26e3f482bebb80ce9d947d3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 69233 + timestamp: 1749230099545 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda sha256: 839dacb741bdbb25e58f42088a2001b649f4f12195aeb700b5ddfca3267749e5 md5: d0bf1dff146b799b319ea0434b93f779 @@ -1333,6 +2424,17 @@ packages: license_family: MIT size: 68426 timestamp: 1725267943211 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_3.conda + sha256: 3eb27c1a589cbfd83731be7c3f19d6d679c7a444c3ba19db6ad8bf49172f3d83 + md5: 1c6eecffad553bde44c5238770cfb7da + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.1.0 hb9d3cd8_3 + - libgcc >=13 + license: MIT + license_family: MIT + size: 33148 + timestamp: 1749230111397 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda sha256: 6c6862eb274f21a7c0b60e5345467a12e6dda8b9af4438c66d496a2c1a538264 md5: 55e66e68ce55523a6811633dd1ac74e2 @@ -1343,6 +2445,17 @@ packages: license_family: MIT size: 28378 timestamp: 1725267980316 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_3.conda + sha256: 76e8492b0b0a0d222bfd6081cae30612aa9915e4309396fdca936528ccf314b7 + md5: 3facafe58f3858eb95527c7d3a3fc578 + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.1.0 hb9d3cd8_3 + - libgcc >=13 + license: MIT + license_family: MIT + size: 282657 + timestamp: 1749230124839 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda sha256: eeb1eb0d58b9d02bc1b98dc0a058f104ab168eb2f7d1c7bfa0570a12cfcdb7b7 md5: 4f3a434504c67b2c42565c0b85c1885c @@ -1353,6 +2466,20 @@ packages: license_family: MIT size: 279644 timestamp: 1725268003553 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-32_he106b2a_openblas.conda + build_number: 32 + sha256: 92a001fc181e6abe4f4a672b81d9413ca2f22609f8a95327dfcc6eee593ffeb9 + md5: 3d3f9355e52f269cd8bc2c440d8a5263 + depends: + - libblas 3.9.0 32_h59b9bed_openblas + constrains: + - blas 2.132 openblas + - liblapack 3.9.0 32*_openblas + - liblapacke 3.9.0 32*_openblas + license: BSD-3-Clause + license_family: BSD + size: 17308 + timestamp: 1750388809353 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-31_hb3479ef_openblas.conda build_number: 31 sha256: f237486cc9118d09d0f3ff8820280de34365f98ee7b7dc5ab923b04c7cbf25a5 @@ -1367,6 +2494,16 @@ packages: license_family: BSD size: 17032 timestamp: 1740088127097 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + sha256: fd1d153962764433fe6233f34a72cdeed5dcf8a883a85769e8295ce940b5b0c5 + md5: c965a5aa0d5c1c37ffc62dff36e28400 + depends: + - libgcc-ng >=9.4.0 + - libstdcxx-ng >=9.4.0 + license: BSD-3-Clause + license_family: BSD + size: 20440 + timestamp: 1633683576494 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 sha256: 58477b67cc719060b5b069ba57161e20ba69b8695d154a719cb4b60caf577929 md5: 32bd82a6a625ea6ce090a81c3d34edeb @@ -1376,6 +2513,22 @@ packages: license_family: BSD size: 18765 timestamp: 1633683992603 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda + sha256: b6c5cf340a4f80d70d64b3a29a7d9885a5918d16a5cb952022820e6d3e79dc8b + md5: 45f6713cb00f124af300342512219182 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libnghttp2 >=1.64.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + size: 449910 + timestamp: 1749033146806 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.14.0-h73640d1_0.conda sha256: 8ecce486f18b2945fd2f4edadc064578d7173c01a581caa8e3f1af271e2846b2 md5: 2cdeda15c3cf49965e589107ca316997 @@ -1400,6 +2553,16 @@ packages: license_family: Apache size: 565811 timestamp: 1745991653948 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda + sha256: 8420748ea1cc5f18ecc5068b4f24c7a023cc9b20971c99c824ba10641fb95ddf + md5: 64f0c503da58ec25ebd359e4d990afa8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 72573 + timestamp: 1747040452262 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.23-h5773f1b_0.conda sha256: ebc06154e9a2085e8c9edf81f8f5196b73a1698e18ac6386c9b43fb426103327 md5: 4dc332b504166d7f89e4b3b18ab5e6ea @@ -1409,6 +2572,18 @@ packages: license_family: MIT size: 54685 timestamp: 1745260666631 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + depends: + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + license: BSD-2-Clause + license_family: BSD + size: 134676 + timestamp: 1738479519902 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 md5: 44083d2d2c2025afca315c7a172eab2b @@ -1420,6 +2595,15 @@ packages: license_family: BSD size: 107691 timestamp: 1738479560845 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + sha256: 1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4 + md5: 172bf1cd1ff8629f2b1179945ed45055 + depends: + - libgcc-ng >=12 + license: BSD-2-Clause + license_family: BSD + size: 112766 + timestamp: 1702146165126 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda sha256: 95cecb3902fbe0399c3a7e67a5bed1db813e5ab0e22f4023a5e0f722f2cc214f md5: 36d33e440c31857372a72137f78bacf5 @@ -1427,6 +2611,16 @@ packages: license_family: BSD size: 107458 timestamp: 1702146414478 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + sha256: 2e14399d81fb348e9d231a82ca4d816bf855206923759b69ad006ba482764131 + md5: a1cfcc585f0c42bf8d5546bb1dfb668d + depends: + - libgcc-ng >=12 + - openssl >=3.1.1,<4.0a0 + license: BSD-3-Clause + license_family: BSD + size: 427426 + timestamp: 1685725977222 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda sha256: 8c136d7586259bb5c0d2b913aaadc5b9737787ae4f40e3ad1beaf96c80b919b7 md5: 1a109764bff3bdc7bdd84088347d71dc @@ -1436,6 +2630,18 @@ packages: license_family: BSD size: 368167 timestamp: 1685726248899 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda + sha256: 33ab03438aee65d6aa667cf7d90c91e5e7d734c19a67aa4c7040742c0a13d505 + md5: db0bfbe7dd197b68ad5f30333bae6ce0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - expat 2.7.0.* + license: MIT + license_family: MIT + size: 74427 + timestamp: 1743431794976 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.0-h286801f_0.conda sha256: ee550e44765a7bbcb2a0216c063dcd53ac914a7be5386dd0554bd06e6be61840 md5: 6934bbb74380e045741eb8637641a65b @@ -1447,6 +2653,16 @@ packages: license_family: MIT size: 65714 timestamp: 1743431789879 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + sha256: 764432d32db45466e87f10621db5b74363a9f847d2b8b1f9743746cd160f06ab + md5: ede4673863426c0883c0063d853bbd85 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 57433 + timestamp: 1743434498161 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda sha256: c6a530924a9b14e193ea9adfe92843de2a806d1b7dbfd341546ece9653129e60 md5: c215a60c2935b517dcda8cad4705734d @@ -1456,6 +2672,14 @@ packages: license_family: MIT size: 39839 timestamp: 1743434670405 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda + sha256: 7be9b3dac469fe3c6146ff24398b685804dfc7a1de37607b84abd076f57cc115 + md5: 51f5be229d83ecd401fb369ab96ae669 + depends: + - libfreetype6 >=2.13.3 + license: GPL-2.0-only OR FTL + size: 7693 + timestamp: 1745369988361 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.13.3-hce30654_1.conda sha256: 1f8c16703fe333cdc2639f7cdaf677ac2120843453222944a7c6c85ec342903c md5: d06282e08e55b752627a707d58779b8f @@ -1464,6 +2688,19 @@ packages: license: GPL-2.0-only OR FTL size: 7813 timestamp: 1745370144506 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda + sha256: 7759bd5c31efe5fbc36a7a1f8ca5244c2eabdbeb8fc1bee4b99cf989f35c7d81 + md5: 3c255be50a506c50765a93a6644f32fe + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libpng >=1.6.47,<1.7.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - freetype >=2.13.3 + license: GPL-2.0-only OR FTL + size: 380134 + timestamp: 1745369987697 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.13.3-h1d14073_1.conda sha256: c278df049b1a071841aa0aca140a338d087ea594e07dcf8a871d2cfe0e330e75 md5: b163d446c55872ef60530231879908b9 @@ -1476,6 +2713,36 @@ packages: license: GPL-2.0-only OR FTL size: 333529 timestamp: 1745370142848 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_3.conda + sha256: 59a87161212abe8acc57d318b0cc8636eb834cdfdfddcf1f588b5493644b39a3 + md5: 9e60c55e725c20d23125a5f0dd69af5d + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==15.1.0=*_3 + - libgomp 15.1.0 h767d61c_3 + license: GPL-3.0-only WITH GCC-exception-3.1 + size: 824921 + timestamp: 1750808216066 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_3.conda + sha256: b0b0a5ee6ce645a09578fc1cb70c180723346f8a45fdb6d23b3520591c6d6996 + md5: e66f2b8ad787e7beb0f846e4bd7e8493 + depends: + - libgcc 15.1.0 h767d61c_3 + license: GPL-3.0-only WITH GCC-exception-3.1 + size: 29033 + timestamp: 1750808224854 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_3.conda + sha256: 77dd1f1efd327e6991e87f09c7c97c4ae1cfbe59d9485c41d339d6391ac9c183 + md5: bfbca721fd33188ef923dfe9ba172f29 + depends: + - libgfortran5 15.1.0 hcea5267_3 + constrains: + - libgfortran-ng ==15.1.0=*_3 + license: GPL-3.0-only WITH GCC-exception-3.1 + size: 29057 + timestamp: 1750808257258 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-14_2_0_h6c33f7e_103.conda sha256: 8628746a8ecd311f1c0d14bb4f527c18686251538f7164982ccbe3b772de58b5 md5: 044a210bc1d5b8367857755665157413 @@ -1485,6 +2752,17 @@ packages: license_family: GPL size: 156291 timestamp: 1743863532821 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_3.conda + sha256: eea6c3cf22ad739c279b4d665e6cf20f8081f483b26a96ddd67d4df3c88dfa0a + md5: 530566b68c3b8ce7eec4cd047eae19fe + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15.1.0 + constrains: + - libgfortran 15.1.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + size: 1565627 + timestamp: 1750808236464 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-14.2.0-h6c33f7e_103.conda sha256: 8599453990bd3a449013f5fa3d72302f1c68f0680622d419c3f751ff49f01f17 md5: 69806c1e957069f1d515830dcc9f6cbb @@ -1496,6 +2774,33 @@ packages: license_family: GPL size: 806566 timestamp: 1743863491726 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_3.conda + sha256: 43710ab4de0cd7ff8467abff8d11e7bb0e36569df04ce1c099d48601818f11d1 + md5: 3cd1a7238a0dd3d0860fdefc496cc854 + depends: + - __glibc >=2.17,<3.0.a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + size: 447068 + timestamp: 1750808138400 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.36.0-hc4361e1_1.conda + sha256: 3a56c653231d6233de5853dc01f07afad6a332799a39c3772c0948d2e68547e4 + md5: ae36e6296a8dd8e8a9a8375965bf6398 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20250127.0,<20250128.0a0 + - libcurl >=8.12.1,<9.0a0 + - libgcc >=13 + - libgrpc >=1.71.0,<1.72.0a0 + - libprotobuf >=5.29.3,<5.29.4.0a0 + - libstdcxx >=13 + - openssl >=3.4.1,<4.0a0 + constrains: + - libgoogle-cloud 2.36.0 *_1 + license: Apache-2.0 + license_family: Apache + size: 1246764 + timestamp: 1741878603939 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.36.0-h9484b08_1.conda sha256: 122a59ae466addc201ef0058d13aa041defd7fdf7f658bae4497c48441c37152 md5: c3d4e6a0aee35d92c99b25bb6fb617eb @@ -1514,6 +2819,23 @@ packages: license_family: Apache size: 874398 timestamp: 1741878533033 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.36.0-h0121fbd_1.conda + sha256: 54235d990009417bb20071f5ce7c8dcf186b19fa7d24d72bc5efd2ffb108001c + md5: a0f7588c1f0a26d550e7bae4fb49427a + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libgcc >=13 + - libgoogle-cloud 2.36.0 hc4361e1_1 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl + license: Apache-2.0 + license_family: Apache + size: 785719 + timestamp: 1741878763994 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.36.0-h7081f7f_1.conda sha256: 64b97ae6ec5173d80ac177f2ef51389e76adecc329bcf9b8e3f2187a0a18d734 md5: d363a9e8d601aace65af282870a40a09 @@ -1530,6 +2852,27 @@ packages: license_family: Apache size: 529458 timestamp: 1741879638484 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.71.0-h8e591d7_1.conda + sha256: 37267300b25f292a6024d7fd9331085fe4943897940263c3a41d6493283b2a18 + md5: c3cfd72cbb14113abee7bbd86f44ad69 + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.34.5,<2.0a0 + - libabseil * cxx17* + - libabseil >=20250127.1,<20250128.0a0 + - libgcc >=13 + - libprotobuf >=5.29.3,<5.29.4.0a0 + - libre2-11 >=2024.7.2 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.71.0 + license: Apache-2.0 + license_family: APACHE + size: 7920187 + timestamp: 1745229332239 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.71.0-h857da87_1.conda sha256: 082668830025c2a2842165724b44d4f742688353932a6705cd61aa4ecb9aa173 md5: 59fe16787c94d3dc92f2dfa533de97c6 @@ -1550,6 +2893,15 @@ packages: license_family: APACHE size: 4908484 timestamp: 1745191611284 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda + sha256: 18a4afe14f731bfb9cf388659994263904d20111e42f841e9eea1bb6f91f4ab4 + md5: e796ff8ddc598affdf7c173d6145f087 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: LGPL-2.1-only + size: 713084 + timestamp: 1740128065462 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-hfe07756_1.conda sha256: d30780d24bf3a30b4f116fca74dedb4199b34d500fe6c52cced5f8cc1e926f03 md5: 450e6bdc0c7d986acf7b8443dce87111 @@ -1558,6 +2910,17 @@ packages: license: LGPL-2.1-only size: 681804 timestamp: 1740128227484 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda + sha256: 98b399287e27768bf79d48faba8a99a2289748c65cd342ca21033fab1860d4a4 + md5: 9fa334557db9f63da6c9285fd2a48638 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + size: 628947 + timestamp: 1745268527144 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.0-h5505292_0.conda sha256: 78df2574fa6aa5b6f5fc367c03192f8ddf8e27dc23641468d54e031ff560b9d4 md5: 01caa4fbcaf0e6b08b3aef1151e91745 @@ -1568,6 +2931,20 @@ packages: license: IJG AND BSD-3-Clause AND Zlib size: 553624 timestamp: 1745268405713 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-32_h7ac8fdf_openblas.conda + build_number: 32 + sha256: 5b55a30ed1b3f8195dad9020fe1c6d0f514829bfaaf0cf5e393e93682af009f2 + md5: 6c3f04ccb6c578138e9f9899da0bd714 + depends: + - libblas 3.9.0 32_h59b9bed_openblas + constrains: + - libcblas 3.9.0 32*_openblas + - blas 2.132 openblas + - liblapacke 3.9.0 32*_openblas + license: BSD-3-Clause + license_family: BSD + size: 17316 + timestamp: 1750388820745 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-31_hc9a63f6_openblas.conda build_number: 31 sha256: fe55b9aaf82c6c0192c3d1fcc9b8e884f97492dda9a8de5dae29334b3135fab5 @@ -1582,6 +2959,17 @@ packages: license_family: BSD size: 17033 timestamp: 1740088134988 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + sha256: f2591c0069447bbe28d4d696b7fcb0c5bd0b4ac582769b89addbcf26fb3430d8 + md5: 1a580f7796c7bf6393fddb8bbbde58dc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - xz 5.8.1.* + license: 0BSD + size: 112894 + timestamp: 1749230047870 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_0.conda sha256: 4291dde55ebe9868491dc29716b84ac3de21b8084cbd4d05c9eea79d206b8ab7 md5: ba24e6f25225fea3d5b6912e2ac562f8 @@ -1599,6 +2987,22 @@ packages: license_family: BSD size: 69263 timestamp: 1723817629767 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + sha256: b0f2b3695b13a989f75d8fd7f4778e1c7aabe3b36db83f0fe80b2cd812c0e975 + md5: 19e57602824042dfd0446292ef90488b + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.32.3,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + license: MIT + license_family: MIT + size: 647599 + timestamp: 1729571887612 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda sha256: 00cc685824f39f51be5233b54e19f45abd60de5d8847f1a56906f8936648b72f md5: 3408c02539cee5f1141f9f11450b6a51 @@ -1614,6 +3018,30 @@ packages: license_family: MIT size: 566719 timestamp: 1729572385640 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + sha256: 927fe72b054277cde6cb82597d0fcf6baf127dcbce2e0a9d8925a68f1265eef5 + md5: d864d34357c3b65a4b731f78c0801dc4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: LGPL-2.1-only + license_family: GPL + size: 33731 + timestamp: 1750274110928 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_0.conda + sha256: 225f4cfdb06b3b73f870ad86f00f49a9ca0a8a2d2afe59440521fafe2b6c23d9 + md5: 323dc8f259224d13078aaf7ce96c3efe + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.3.0 + constrains: + - openblas >=0.3.30,<0.3.31.0a0 + license: BSD-3-Clause + license_family: BSD + size: 5916819 + timestamp: 1750379877844 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.29-openmp_hf332438_0.conda sha256: 8989d9e01ec8c9b2d48dbb5efbe70b356fcd15990fb53b64fcb84798982c0343 md5: 0cd1148c68f09027ee0b0f0179f77c30 @@ -1628,6 +3056,25 @@ packages: license_family: BSD size: 4168442 timestamp: 1739825514918 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.21.0-hd1b1c89_0.conda + sha256: b88de51fa55513483e7c80c43d38ddd3559f8d17921879e4c99909ba66e1c16b + md5: 4b25cd8720fd8d5319206e4f899f2707 + depends: + - libabseil * cxx17* + - libabseil >=20250127.1,<20250128.0a0 + - libcurl >=8.14.0,<9.0a0 + - libgrpc >=1.71.0,<1.72.0a0 + - libopentelemetry-cpp-headers 1.21.0 ha770c72_0 + - libprotobuf >=5.29.3,<5.29.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.21.0 + license: Apache-2.0 + license_family: APACHE + size: 882002 + timestamp: 1748592427188 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.21.0-h0181452_0.conda sha256: b8efde22e677991932fbae39ff38a1a63214e0df18dc3b21c6560e525fd2e087 md5: 4f1b40f024b383fdbcc1446f932cc583 @@ -1647,6 +3094,13 @@ packages: license_family: APACHE size: 561337 timestamp: 1748592611158 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.21.0-ha770c72_0.conda + sha256: dbd811e7a7bd9b96fccffe795ba539ac6ffcc5e564d0bec607f62aa27fa86a17 + md5: 11b1bed92c943d3b741e8a1e1a815ed1 + license: Apache-2.0 + license_family: APACHE + size: 359509 + timestamp: 1748592389311 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.21.0-hce30654_0.conda sha256: e5f85f2c2744a214a16e4ab1ac8b333b426c9842c9bdb1e0dab8c16fb9abe810 md5: be664b8a15a8cdbdb171668e4b8c203c @@ -1654,6 +3108,20 @@ packages: license_family: APACHE size: 361341 timestamp: 1748592544575 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-20.0.0-h081d1f1_8_cpu.conda + build_number: 8 + sha256: c3bc9454b25f8d32db047c282645ae33fe96b5d4d9bde66099fb49cf7a6aa90c + md5: d64065a5ab0a8d466b7431049e531995 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 20.0.0 h1b9301b_8_cpu + - libgcc >=13 + - libstdcxx >=13 + - libthrift >=0.21.0,<0.21.1.0a0 + - openssl >=3.5.0,<4.0a0 + license: Apache-2.0 + size: 1244187 + timestamp: 1750865279989 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-20.0.0-h636d7b7_6_cpu.conda build_number: 6 sha256: 726e48e351e7ef5aa88e8f8c4e623b18f3186e50852b903f5fad80c195e8db6e @@ -1667,6 +3135,16 @@ packages: license: Apache-2.0 size: 895920 timestamp: 1748961288120 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.49-h943b412_0.conda + sha256: c8f5dc929ba5fcee525a66777498e03bbcbfefc05a0773e5163bb08ac5122f1a + md5: 37511c874cf3b8d0034c8d24e73c0884 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + license: zlib-acknowledgement + size: 289506 + timestamp: 1750095629466 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.47-h3783ad8_0.conda sha256: dc93cc30f59b28e7812c6f14d2c2e590b509c38092cce7ababe6b23541b7ed8f md5: 3550e05e3af94a3fa9cef2694417ccdf @@ -1676,6 +3154,20 @@ packages: license: zlib-acknowledgement size: 259332 timestamp: 1739953032676 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.29.3-h501fc15_1.conda + sha256: 691af28446345674c6b3fb864d0e1a1574b6cc2f788e0f036d73a6b05dcf81cf + md5: edb86556cf4a0c133e7932a1597ff236 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20250127.1,<20250128.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 3358788 + timestamp: 1745159546868 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.29.3-hccd9074_1.conda sha256: 6e5b49bfa09bfc1aa0d69113be435d40ace0d01592b7b22cac696928cee6be03 md5: f7951fdf76556f91bc146384ede7de40 @@ -1689,6 +3181,20 @@ packages: license_family: BSD size: 2613087 timestamp: 1745158781377 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.06.26-hba17884_0.conda + sha256: 89535af669f63e0dc4ae75a5fc9abb69b724b35e0f2ca0304c3d9744a55c8310 + md5: f6881c04e6617ebba22d237c36f1b88e + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20250127.1,<20250128.0a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - re2 2025.06.26.* + license: BSD-3-Clause + size: 211720 + timestamp: 1751053073521 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-hd41c47c_3.conda sha256: 038db1da2b9f353df6532af224c20d985228d3408d2af25aa34974f6dbee76e1 md5: 1466284c71c62f7a9c4fa08ed8940f20 @@ -1703,6 +3209,14 @@ packages: license_family: BSD size: 167268 timestamp: 1741121355716 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 + md5: a587892d3c13b6621a6091be690dbca2 + depends: + - libgcc-ng >=12 + license: ISC + size: 205978 + timestamp: 1716828628198 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda sha256: fade8223e1e1004367d7101dd17261003b60aa576df6d7802191f8972f7470b1 md5: a7ce36e284c5faaf93c220dfc39e3abd @@ -1711,6 +3225,16 @@ packages: license: ISC size: 164972 timestamp: 1716828607917 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.1-h6cd9bfd_7.conda + sha256: 9a9e5bf30178f821d4f8de25eac0ae848915bfde6a78a66ae8b77d9c33d9d0e5 + md5: c7c4888059a8324e52de475d1e7bdc53 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + license: Unlicense + size: 919723 + timestamp: 1750925531920 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.49.1-h3f77e49_2.conda sha256: 907a95f73623c343fc14785cbfefcb7a6b4f2bcf9294fcb295c121611c3a590d md5: 3b1e330d775170ac46dff9a94c253bd0 @@ -1720,6 +3244,18 @@ packages: license: Unlicense size: 900188 timestamp: 1742083865246 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + sha256: fa39bfd69228a13e553bd24601332b7cfeb30ca11a3ca50bb028108fe90a7661 + md5: eecce068c7e4eddeb169591baac20ac4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + license: BSD-3-Clause + license_family: BSD + size: 304790 + timestamp: 1745608545575 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda sha256: 8bfe837221390ffc6f111ecca24fa12d4a6325da0c8d131333d63d6c37f27e0a md5: b68e8f66b94b44aaa8de4583d3d4cc40 @@ -1730,6 +3266,37 @@ packages: license_family: BSD size: 279193 timestamp: 1745608793272 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_3.conda + sha256: 7650837344b7850b62fdba02155da0b159cf472b9ab59eb7b472f7bd01dff241 + md5: 6d11a5edae89fe413c0569f16d308f5a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 15.1.0 h767d61c_3 + license: GPL-3.0-only WITH GCC-exception-3.1 + size: 3896407 + timestamp: 1750808251302 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_3.conda + sha256: bbaea1ecf973a7836f92b8ebecc94d3c758414f4de39d2cc6818a3d10cb3216b + md5: 57541755b5a51691955012b8e197c06c + depends: + - libstdcxx 15.1.0 h8f9b012_3 + license: GPL-3.0-only WITH GCC-exception-3.1 + size: 29093 + timestamp: 1750808292700 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.21.0-h0e7cc3e_0.conda + sha256: ebb395232973c18745b86c9a399a4725b2c39293c9a91b8e59251be013db42f0 + md5: dcb95c0a98ba9ff737f7ae482aef7833 + depends: + - __glibc >=2.17,<3.0.a0 + - libevent >=2.1.12,<2.1.13.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + license: Apache-2.0 + license_family: APACHE + size: 425773 + timestamp: 1727205853307 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda sha256: 7a6c7d5f58cbbc2ccd6493b4b821639fdb0701b9b04c737a949e8cb6adf1c9ad md5: 7ce2bd2f650f8c31ad7ba4c7bfea61b7 @@ -1743,6 +3310,23 @@ packages: license_family: APACHE size: 324342 timestamp: 1727206096912 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda + sha256: 7fa6ddac72e0d803bb08e55090a8f2e71769f1eb7adbd5711bdd7789561601b1 + md5: e79a094918988bb1807462cd42c83962 + depends: + - __glibc >=2.17,<3.0.a0 + - lerc >=4.0.0,<5.0a0 + - libdeflate >=1.24,<1.25.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.1.0,<4.0a0 + - liblzma >=5.8.1,<6.0a0 + - libstdcxx >=13 + - libwebp-base >=1.5.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: HPND + size: 429575 + timestamp: 1747067001268 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-h551f018_4.conda sha256: 5d3f7a71b70f0d88470eda8e7b6afe3095d66708a70fb912e79d56fc30b35429 md5: 717e02c4cca2a760438384d48b7cd1b9 @@ -1759,6 +3343,16 @@ packages: license: HPND size: 370898 timestamp: 1745372834516 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.10.0-h202a827_0.conda + sha256: c4ca78341abb308134e605476d170d6f00deba1ec71b0b760326f36778972c0e + md5: 0f98f3e95272d118f7931b6bef69bfe5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 83080 + timestamp: 1748341697686 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.10.0-h74a6958_0.conda sha256: db843568afeafcb7eeac95b44f00f3e5964b9bb6b94d6880886843416d3f7618 md5: 639880d40b6e2083e20b86a726154864 @@ -1768,6 +3362,25 @@ packages: license_family: MIT size: 83815 timestamp: 1748341829716 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + license: BSD-3-Clause + license_family: BSD + size: 33601 + timestamp: 1680112270483 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb9d3cd8_0.conda + sha256: 770ca175d64323976c9fe4303042126b2b01c1bd54c8c96cafeaba81bdb481b8 + md5: 1349c022c92c5efd3fd705a79a5804d8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 890145 + timestamp: 1748304699136 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.50.0-h5505292_0.conda sha256: d13fb49d4c8262bf2c44ffb2c77bb2b5d0f85fc6de76bdb75208efeccb29fce6 md5: 20717343fb30798ab7c23c2e92b748c1 @@ -1777,6 +3390,18 @@ packages: license_family: MIT size: 418890 timestamp: 1737016751326 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda + sha256: c45283fd3e90df5f0bd3dbcd31f59cdd2b001d424cf30a07223655413b158eaf + md5: 63f790534398730f59e1b899c3644d4a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - libwebp 1.5.0 + license: BSD-3-Clause + license_family: BSD + size: 429973 + timestamp: 1734777489810 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.5.0-h2471fea_0.conda sha256: f8bdb876b4bc8cb5df47c28af29188de8911c3fea4b799a33743500149de3f4a md5: 569466afeb84f90d5bb88c11cc23d746 @@ -1788,6 +3413,19 @@ packages: license_family: BSD size: 290013 timestamp: 1734777593617 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa + md5: 92ed62436b625154323d40d5f2f11dd7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + license: MIT + license_family: MIT + size: 395888 + timestamp: 1727278577118 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda sha256: bd3816218924b1e43b275863e21a3e13a5db4a6da74cca8e60bc3c213eb62f71 md5: af523aae2eca6dfa1c8eec693f5b9a79 @@ -1800,6 +3438,28 @@ packages: license_family: MIT size: 323658 timestamp: 1727278733917 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + license: LGPL-2.1-or-later + size: 100393 + timestamp: 1702724383534 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda + sha256: b0b3a96791fa8bb4ec030295e8c8bf2d3278f33c0f9ad540e73b5e538e6268e7 + md5: 14dbe05b929e329dbaa6f2d0aa19466d + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 + - libgcc >=13 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + size: 690864 + timestamp: 1746634244154 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.8-h52572c6_0.conda sha256: 13eb825eddce93761d965da3edaf3a42d868c61ece7d9cf21f7e2a13087c2abe md5: d7884c7af8af5a729353374c189aede8 @@ -1813,6 +3473,18 @@ packages: license_family: MIT size: 583068 timestamp: 1746634531197 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 60963 + timestamp: 1727963148474 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b md5: 369964e85dc26bfe78f41399b366c435 @@ -1862,6 +3534,43 @@ packages: license_family: MIT size: 6035295 timestamp: 1749294604381 +- conda: https://conda.anaconda.org/conda-forge/noarch/litellm-1.73.2-pyhd8ed1ab_0.conda + sha256: ab3be44e2fc3d0273d9f747e18158810bcf4946ef761d30ca8b7b4c9e50b3ccc + md5: f9a52491bdb9b55ff52817a4d6487812 + depends: + - aiohttp >=3.10 + - click + - httpx >=0.23.0 + - importlib-metadata >=6.8.0 + - jinja2 >=3.1.2,<4.0.0 + - jsonschema >=4.22.0,<5.0.0 + - openai >=1.68.2 + - pydantic >=2.0.0,<3.0.0 + - python >=3.9 + - python-dotenv >=0.2.0 + - tiktoken >=0.7.0 + - tokenizers + constrains: + - uvicorn >=0.29.0,<0.30.0 + - apscheduler >=3.10.4,<4.0.0 + - google-cloud-kms >=2.21.3,<3.0.0 + - pyyaml >=6.0.1,<7.0.0 + - resend >=0.8.0,<0.9.0 + - azure-keyvault-secrets >=4.8.0,<5.0.0 + - uvloop >=0.21.0,<0.22.0 + - pyjwt >=2.8.0,<3.0.0 + - cryptography >=43.0.1,<44.0.0 + - python-multipart >=0.0.18,<0.0.19 + - gunicorn >=22.0.0,<23.0.0 + - azure-identity >=1.15.0,<2.0.0 + - orjson >=3.9.7,<4.0.0 + - fastapi-sso >=0.16.0,<0.17.0 + - pynacl >=1.5.0,<2.0.0 + - fastapi >=0.111.5,<1.0.0 + - prisma >=0.11.0,<0.12.0 + license: MIT + size: 6367366 + timestamp: 1750986696095 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-20.1.3-hdb05f8b_0.conda sha256: daddebd6ebf2960bb3bae945230ed07b254f430642c739c00ebfb4a8c747a033 md5: 9f2cc154dd184ff808c2c6afd21cb12c @@ -1873,6 +3582,16 @@ packages: license_family: APACHE size: 282301 timestamp: 1744934108744 +- conda: https://conda.anaconda.org/conda-forge/noarch/loguru-0.7.3-pyh707e725_0.conda + sha256: e4a07f357a4cf195a2345dabd98deab80f4d53574abe712a9cc7f22d3f2cc2c3 + md5: 49647ac1de4d1e4b49124aedf3934e02 + depends: + - __unix + - python >=3.9 + license: MIT + license_family: MIT + size: 59696 + timestamp: 1746634858826 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/loguru-0.7.2-py313h8f79df9_2.conda sha256: 0a8d95f516a041d8ee365f8c196ac1a017d80e5405a75be323cdffcfac7cf0fe md5: d52009653b377e5f2b64d3bea2677822 @@ -1884,6 +3603,17 @@ packages: license_family: MIT size: 127794 timestamp: 1725349988436 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346 + md5: 9de5350a85c4a20c685259b889aa6393 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: BSD-2-Clause + license_family: BSD + size: 167055 + timestamp: 1733741040117 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda sha256: 94d3e2a485dab8bdfdd4837880bde3dd0d701e2b97d6134b8806b7c8e69c8652 md5: 01511afc6cc1909c5303cf31be17b44f @@ -1894,6 +3624,20 @@ packages: license_family: BSD size: 148824 timestamp: 1733741047892 +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda + sha256: 4a6bf68d2a2b669fecc9a4a009abd1cf8e72c2289522ff00d81b5a6e51ae78f5 + md5: eb227c3e0bf58f5bd69c0532b157975b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + size: 24604 + timestamp: 1733219911494 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.2-py313ha9b7d5b_1.conda sha256: 81759af8a9872c8926af3aa59dc4986eee90a0956d1ec820b42ac4f949a71211 md5: 3acf05d8e42ff0d99820d2d889776fff @@ -1908,6 +3652,34 @@ packages: license_family: BSD size: 24757 timestamp: 1733219916634 +- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.3-py312hd3ec401_0.conda + sha256: 3b5be100ddfcd5697140dbb8d4126e3afd0147d4033defd6c6eeac78fe089bd2 + md5: 2d69618b52d70970c81cc598e4b51118 + depends: + - __glibc >=2.17,<3.0.a0 + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.22.0 + - freetype + - kiwisolver >=1.3.1 + - libfreetype >=2.13.3 + - libfreetype6 >=2.13.3 + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.19,<3 + - numpy >=1.23 + - packaging >=20.0 + - pillow >=8 + - pyparsing >=2.3.1 + - python >=3.12,<3.13.0a0 + - python-dateutil >=2.7 + - python_abi 3.12.* *_cp312 + - qhull >=2020.2,<2020.3.0a0 + - tk >=8.6.13,<8.7.0a0 + license: PSF-2.0 + license_family: PSF + size: 8188885 + timestamp: 1746820680864 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.10.1-py313haaf02c0_0.conda sha256: 0bb77afd6d7b2ce64ce57507cb19e1a88120cc94aed5d113b12121d562281bac md5: e49b9e81d6d840d16910d2a08dd884bc @@ -1943,6 +3715,17 @@ packages: license_family: BSD size: 14467 timestamp: 1733417051523 +- conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.6.0-py312h178313f_0.conda + sha256: a51aad4f15e9719f930883548b86f9b054c8bbc1fd60d641a7f364bb102fbf09 + md5: 1f707aeb79342d79881d44552ddab8e2 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + size: 96554 + timestamp: 1751089445335 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multidict-6.4.4-py313h6347b5a_0.conda sha256: ae30134cc024f42434ba95e6376b3977dc96f2d377c11d857bdb020fdd13cc29 md5: 6a43ef7ba68bde88cd029b140b90c071 @@ -1955,6 +3738,19 @@ packages: license_family: APACHE size: 75248 timestamp: 1747722748962 +- conda: https://conda.anaconda.org/conda-forge/linux-64/multiprocess-0.70.16-py312h66e93f0_1.conda + sha256: 459092c4e9305e00a0207b764a266c9caa14d82196322b2a74c96028c563a809 + md5: efe4a3f62320156f68579362314009f3 + depends: + - __glibc >=2.17,<3.0.a0 + - dill >=0.3.8 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + size: 340540 + timestamp: 1724954755987 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/multiprocess-0.70.16-py313h20a7fcf_1.conda sha256: 82e81dcbd78681e4b377a6bd80d26e1126811bf2bd17f7b0f41f8102b597f055 md5: 7648ca94c49cf814ef338cd8b7d04df3 @@ -1977,6 +3773,15 @@ packages: license_family: Apache size: 12452 timestamp: 1600387789153 +- conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + sha256: d09c47c2cf456de5c09fa66d2c3c5035aa1fa228a1983a433c47b876aa16ce90 + md5: 37293a85a0f4f77bbd9cf7aaefc62609 + depends: + - python >=3.9 + license: Apache-2.0 + license_family: Apache + size: 15851 + timestamp: 1749895533014 - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda sha256: 6ed158e4e5dd8f6a10ad9e525631e35cee8557718f83de7a4e3966b1f772c4b1 md5: e9c622e0d00fa24a6292279af3ab6d06 @@ -1986,6 +3791,15 @@ packages: license_family: MIT size: 11766 timestamp: 1745776666688 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: X11 AND BSD-3-Clause + size: 891641 + timestamp: 1738195959188 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 md5: 068d497125e4bf8a66bf707254fff5ae @@ -2003,6 +3817,13 @@ packages: license_family: BSD size: 11543 timestamp: 1733325673691 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h3f2d84a_0.conda + sha256: e2fc624d6f9b2f1b695b6be6b905844613e813aa180520e73365062683fe7b49 + md5: d76872d096d063e226482c99337209dc + license: MIT + license_family: MIT + size: 135906 + timestamp: 1744445169928 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.12.0-ha1acc90_0.conda sha256: 6e689213c8d5e5f65ef426c0fcfb41b056e4c4d90fc020631cfddb6c87d5d6c9 md5: c74975897efab6cdc7f5ac5a69cca2f3 @@ -2010,6 +3831,22 @@ packages: license_family: MIT size: 136487 timestamp: 1744445244122 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nodejs-22.13.0-hf235a45_0.conda + sha256: 925ea8839d6f26d0eb4204675b98a862803a9a9657fd36a4a22c4c29a479a911 + md5: 1f9efd96347aa008bd2c735d7d88fc75 + depends: + - __glibc >=2.28,<3.0.a0 + - icu >=75.1,<76.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libuv >=1.50.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.1,<4.0a0 + - zlib + license: MIT + license_family: MIT + size: 21691794 + timestamp: 1741809786920 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-22.13.0-h02a13b7_0.conda sha256: d390651526630468e385a74474bb3f17849861182257c161bbca8fca7734d578 md5: 93cd91b998422ebf2dace6c13c1842ce @@ -2025,6 +3862,24 @@ packages: license_family: MIT size: 15490642 timestamp: 1737401388520 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.0-py312h6cf2f7f_0.conda + sha256: 59da92a150737e830c75e8de56c149d6dc4e42c9d38ba30d2f0d4787a0c43342 + md5: 8b4095ed29d1072f7e4badfbaf9e5851 + depends: + - __glibc >=2.17,<3.0.a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc >=13 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + size: 8417476 + timestamp: 1749430957684 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.2.5-py313h41a2e72_0.conda sha256: ef86c22868df8ce165ea17932d11232f76d06524f6fd1e35f1c307413afd9e48 md5: 40517bbc5a052593ba752750550819a4 @@ -2061,6 +3916,38 @@ packages: license_family: MIT size: 272230 timestamp: 1745968500831 +- conda: https://conda.anaconda.org/conda-forge/noarch/openai-1.93.0-pyhd8ed1ab_0.conda + sha256: fa6e062e90f5a80afc8dbd9915498c34548cd7c45c61b865e850e2995ff34ecb + md5: ba906faef1883c21dfa79dcfc7a4ff70 + depends: + - anyio >=3.5.0,<5 + - distro >=1.7.0,<2 + - httpx >=0.23.0,<1 + - jiter >=0.4.0,<1 + - pydantic >=1.9.0,<3 + - python >=3.9 + - sniffio + - tqdm >4 + - typing-extensions >=4.11,<5 + - typing_extensions >=4.11,<5 + license: MIT + license_family: MIT + size: 299546 + timestamp: 1751086291197 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda + sha256: 5bee706ea5ba453ed7fd9da7da8380dd88b865c8d30b5aaec14d2b6dd32dbc39 + md5: 9e5816bc95d285c115a3ebc2f8563564 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libpng >=1.6.44,<1.7.0a0 + - libstdcxx >=13 + - libtiff >=4.7.0,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-2-Clause + license_family: BSD + size: 342988 + timestamp: 1733816638720 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.3-h8a3d83b_0.conda sha256: 1d59bc72ca7faac06d349c1a280f5cfb8a57ee5896f1e24225a997189d7418c7 md5: 4b71d78648dbcf68ce8bf22bb07ff838 @@ -2074,6 +3961,17 @@ packages: license_family: BSD size: 319362 timestamp: 1733816781741 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_1.conda + sha256: b4491077c494dbf0b5eaa6d87738c22f2154e9277e5293175ec187634bd808a0 + md5: de356753cfdbffcde5bb1e86e3aa6cd0 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=13 + license: Apache-2.0 + license_family: Apache + size: 3117410 + timestamp: 1746223723843 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.0-h81ee809_0.conda sha256: 53f825acb8d3e13bdad5c869f6dc7df931941450eea7f6473b955b0aaea1a399 md5: 3d2936da7e240d24c656138e07fa2502 @@ -2084,6 +3982,23 @@ packages: license_family: Apache size: 3067649 timestamp: 1744132084304 +- conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.1.2-h17f744e_0.conda + sha256: f6ff644e27f42f2beb877773ba3adc1228dbb43530dbe9426dd672f3b847c7c5 + md5: ef7f9897a244b2023a066c22a1089ce4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libprotobuf >=5.29.3,<5.29.4.0a0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - tzdata + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 + license_family: Apache + size: 1242887 + timestamp: 1746604310927 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.1.2-hd90e43c_0.conda sha256: b67606050e2f4c0fbd457c94e60d538a7646f404efa201049a26834674411856 md5: 2eb36675dbc7c8dc0a24901ba0ca5542 @@ -2110,6 +4025,56 @@ packages: license_family: APACHE size: 62477 timestamp: 1745345660407 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.3.0-py312hf9745cd_0.conda + sha256: 44f5587c1e1a9f0257387dd18735bcf65a67a6089e723302dc7947be09d9affe + md5: ac82ac336dbe61106e21fb2e11704459 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.19,<3 + - numpy >=1.22.4 + - python >=3.12,<3.13.0a0 + - python-dateutil >=2.8.2 + - python-tzdata >=2022.7 + - python_abi 3.12.* *_cp312 + - pytz >=2020.1 + constrains: + - bottleneck >=1.3.6 + - blosc >=1.21.3 + - numba >=0.56.4 + - pyqt5 >=5.15.9 + - pyarrow >=10.0.1 + - gcsfs >=2022.11.0 + - xlsxwriter >=3.0.5 + - scipy >=1.10.0 + - beautifulsoup4 >=4.11.2 + - numexpr >=2.8.4 + - fastparquet >=2022.12.0 + - lxml >=4.9.2 + - xlrd >=2.0.1 + - openpyxl >=3.1.0 + - qtpy >=2.3.0 + - s3fs >=2022.11.0 + - pandas-gbq >=0.19.0 + - pytables >=3.8.0 + - python-calamine >=0.1.7 + - fsspec >=2022.11.0 + - psycopg2 >=2.9.6 + - xarray >=2022.12.0 + - matplotlib >=3.6.3 + - pyxlsb >=1.0.10 + - tabulate >=0.9.0 + - odfpy >=1.4.1 + - pyreadstat >=1.2.0 + - html5lib >=1.1 + - zstandard >=0.19.0 + - sqlalchemy >=2.0.0 + - tzdata >=2022.7 + license: BSD-3-Clause + license_family: BSD + size: 14958450 + timestamp: 1749100123120 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.3-py313h668b085_3.conda sha256: f15b39a3e38113e60eaec255c5588a81c637df1affb3c80176d3248f68bda90a md5: d632aa5a481e9577865ea5af125f881c @@ -2206,6 +4171,27 @@ packages: license_family: MIT size: 11748 timestamp: 1733327448200 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.2.1-py312h80c1187_0.conda + sha256: 15f32ec89f3a7104fcb190546a2bc0fc279372d9073e5ec08a8d61a1c79af4c0 + md5: ca438bf57e4f2423d261987fe423a0dd + depends: + - __glibc >=2.17,<3.0.a0 + - lcms2 >=2.17,<3.0a0 + - libfreetype >=2.13.3 + - libfreetype6 >=2.13.3 + - libgcc >=13 + - libjpeg-turbo >=3.1.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.5.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.3,<3.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tk >=8.6.13,<8.7.0a0 + license: HPND + size: 42506161 + timestamp: 1746646366556 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-11.1.0-py313hb37fac4_0.conda sha256: 207bf61d21164ea8922a306734e602354b8b8e516460dc22c18add1e7594793b md5: 50dbf6e817535229c820af0a8f4529b5 @@ -2244,6 +4230,25 @@ packages: license_family: MIT size: 23291 timestamp: 1742485085457 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda + sha256: 0f48999a28019c329cd3f6fd2f01f09fc32cc832f7d6bbe38087ddac858feaa3 + md5: 424844562f5d337077b445ec6b1398a7 + depends: + - python >=3.9 + - python + license: MIT + license_family: MIT + size: 23531 + timestamp: 1746710438805 +- conda: https://conda.anaconda.org/conda-forge/linux-64/playwright-1.53.1-hbf95b10_0.conda + sha256: 58b9504de97b6cdc62cec0a4fc338959a3d4d88e828bad66685a59515fc3ef11 + md5: a3a518dcba659ff2bb1689802a25eb9b + depends: + - nodejs >=22.13.0,<23.0a0 + license: Apache-2.0 + license_family: APACHE + size: 1867645 + timestamp: 1750296223275 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/playwright-1.52.0-h3339cab_0.conda sha256: 6ce375b9068c6cd73c2610efb89b9a1960b1b757272764b72e67945ffd476af8 md5: 0e3edba2319c96771acccdfb26150124 @@ -2253,6 +4258,20 @@ packages: license_family: APACHE size: 1946422 timestamp: 1745045559145 +- conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + sha256: 013669433eb447548f21c3c6b16b2ed64356f726b5f77c1b39d5ba17a8a4b8bc + md5: a83f6a2fdc079e643237887a37460668 + depends: + - __glibc >=2.17,<3.0.a0 + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - zlib + license: MIT + license_family: MIT + size: 199544 + timestamp: 1730769112346 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda sha256: 851a77ae1a8e90db9b9f3c4466abea7afb52713c3d98ceb0d37ba6ff27df2eff md5: 7172339b49c94275ba42fec3eaeda34f @@ -2278,6 +4297,18 @@ packages: license_family: BSD size: 271841 timestamp: 1744724188108 +- conda: https://conda.anaconda.org/conda-forge/linux-64/propcache-0.3.1-py312h178313f_0.conda + sha256: d0ff67d89cf379a9f0367f563320621f0bc3969fe7f5c85e020f437de0927bb4 + md5: 0cf580c1b73146bb9ff1bbdb4d4c8cf9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: APACHE + size: 54233 + timestamp: 1744525107433 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/propcache-0.3.1-py313ha9b7d5b_0.conda sha256: 0b98966e2c2fbba137dea148dfb29d6a604e27d0f5b36223560387f83ee3d5a1 md5: 4eb9e019ebc1224f1963031b7b09630e @@ -2290,6 +4321,18 @@ packages: license_family: APACHE size: 51553 timestamp: 1744525184775 +- conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.0.0-py312h66e93f0_0.conda + sha256: 158047d7a80e588c846437566d0df64cec5b0284c7184ceb4f3c540271406888 + md5: 8e30db4239508a538e4a3b3cdf5b9616 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + size: 466219 + timestamp: 1740663246825 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.0.0-py313h90d716c_0.conda sha256: a3d8376cf24ee336f63d3e6639485b68c592cf5ed3e1501ac430081be055acf9 md5: 21105780750e89c761d1c72dc5304930 @@ -2302,6 +4345,16 @@ packages: license_family: BSD size: 484139 timestamp: 1740663381126 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 + md5: b3c17d95b5a10c6e64a21fa17573e70e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 8252 + timestamp: 1726802366959 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda sha256: 8ed65e17fbb0ca944bfb8093b60086e3f9dd678c3448b5de212017394c247ee3 md5: 415816daf82e0b23a736a069a75e9da7 @@ -2328,6 +4381,21 @@ packages: license_family: MIT size: 16668 timestamp: 1733569518868 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-20.0.0-py312h7900ff3_0.conda + sha256: f7b08ff9ef4626e19a3cd08165ca1672675168fa9af9c2b0d2a5c104c71baf01 + md5: 57b626b4232b77ee6410c7c03a99774d + depends: + - libarrow-acero 20.0.0.* + - libarrow-dataset 20.0.0.* + - libarrow-substrait 20.0.0.* + - libparquet 20.0.0.* + - pyarrow-core 20.0.0 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: APACHE + size: 25757 + timestamp: 1746001175919 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-20.0.0-py313h39782a4_0.conda sha256: 6d6e9d97fe0ff2e8aa15f14cc7fc15038270727cfdf17dfdb23ef56f082f89a1 md5: e13d1a17f3dc588355114b7a06304408 @@ -2343,6 +4411,24 @@ packages: license_family: APACHE size: 25893 timestamp: 1746000798861 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-20.0.0-py312h01725c0_0_cpu.conda + sha256: afd636ecaea60e1ebb422b1a3e5a5b8f6f28da3311b7079cbd5caa4464a50a48 + md5: 9b1b453cdb91a2f24fb0257bbec798af + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 20.0.0.* *cpu + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - apache-arrow-proc * cpu + - numpy >=1.21,<3 + license: Apache-2.0 + license_family: APACHE + size: 4658639 + timestamp: 1746000738593 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-20.0.0-py313hf9431ad_0_cpu.conda sha256: b2a7eb823b6a0bc128b03f15111e6d7dd668e3b88d07dbee28f61424d2131c37 md5: 60d5091f3fc15ecbc1c24a5e4b65fd33 @@ -2385,6 +4471,35 @@ packages: license_family: MIT size: 306616 timestamp: 1744192311966 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.11.7-pyh3cfb1c2_0.conda + sha256: ee7823e8bc227f804307169870905ce062531d36c1dcf3d431acd65c6e0bd674 + md5: 1b337e3d378cde62889bb735c024b7a2 + depends: + - annotated-types >=0.6.0 + - pydantic-core 2.33.2 + - python >=3.9 + - typing-extensions >=4.6.1 + - typing-inspection >=0.4.0 + - typing_extensions >=4.12.2 + license: MIT + license_family: MIT + size: 307333 + timestamp: 1749927245525 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.33.2-py312h680f630_0.conda + sha256: 4d14d7634c8f351ff1e63d733f6bb15cba9a0ec77e468b0de9102014a4ddc103 + md5: cfbd96e5a0182dfb4110fc42dda63e57 + depends: + - python + - typing-extensions >=4.6.0,!=4.7.0 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + size: 1890081 + timestamp: 1746625309715 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.33.1-py313hb5fa170_0.conda sha256: 75b26de3944e6776c840bd57fc47dee97bb044f939f7be94ea83f4793565f836 md5: 1eda9d26ca9989463540c1512a819706 @@ -2409,6 +4524,15 @@ packages: license_family: BSD size: 888600 timestamp: 1736243563082 +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + sha256: 5577623b9f6685ece2697c6eb7511b4c9ac5fb607c9babc2646c811b428fd46a + md5: 6b6ece66ebcae2d5f326c77ef2c5a066 + depends: + - python >=3.9 + license: BSD-2-Clause + license_family: BSD + size: 889287 + timestamp: 1750615908735 - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda sha256: b92afb79b52fcf395fd220b29e0dd3297610f2059afac45298d44e00fcbf23b6 md5: 513d3c262ee49b54a8fec85c5bc99764 @@ -2428,6 +4552,32 @@ packages: license_family: BSD size: 21085 timestamp: 1733217331982 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.11-h9e4cc4f_0_cpython.conda + sha256: 6cca004806ceceea9585d4d655059e951152fc774a471593d4f5138e6a54c81d + md5: 94206474a5608243a10c92cefbe0908f + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - libgcc >=13 + - liblzma >=5.8.1,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.50.0,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.5.0,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + size: 31445023 + timestamp: 1749050216615 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.3-h81fe080_101_cp313.conda build_number: 101 sha256: f96468ab1e6f27bda92157bfc7f272d1fbf2ba2f85697bdc5bb106bccba1befb @@ -2451,6 +4601,16 @@ packages: size: 12136505 timestamp: 1744663807953 python_site_packages_path: lib/python3.13/site-packages +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + sha256: d6a17ece93bbd5139e02d2bd7dbfa80bee1a4261dced63f65f679121686bf664 + md5: 5b8d21249ff20967101ffa321cab24e8 + depends: + - python >=3.9 + - six >=1.5 + - python + license: Apache-2.0 + size: 233310 + timestamp: 1751104122689 - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda sha256: a50052536f1ef8516ed11a844f9413661829aa083304dc624c5925298d078d79 md5: 5ba79d7c71f03c678c8ead841f347d6e @@ -2471,6 +4631,24 @@ packages: license_family: BSD size: 25557 timestamp: 1742948348635 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.1.1-pyhe01879c_0.conda + sha256: 9a90570085bedf4c6514bcd575456652c47918ff3d7b383349e26192a4805cc8 + md5: a245b3c04afa11e2e52a0db91550da7c + depends: + - python >=3.9 + - python + license: BSD-3-Clause + size: 26031 + timestamp: 1750789290754 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.11-hd8ed1ab_0.conda + sha256: b8afeaefe409d61fa4b68513b25a66bb17f3ca430d67cfea51083c7bfbe098ef + md5: 859c6bec94cd74119f12b961aba965a8 + depends: + - cpython 3.12.11.* + - python_abi * *_cp312 + license: Python-2.0 + size: 45836 + timestamp: 1749047798827 - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.2-pyhd8ed1ab_0.conda sha256: e8392a8044d56ad017c08fec2b0eb10ae3d1235ac967d0aab8bd7b41c4a5eaf0 md5: 88476ae6ebd24f39261e0854ac244f33 @@ -2480,6 +4658,19 @@ packages: license_family: APACHE size: 144160 timestamp: 1742745254292 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_2.conda + sha256: b5950a737d200e2e3cf199ab7b474ac194fcf4d6bee13bcbdf32c5a5cca7eaf0 + md5: cc3f6c452697c1cf7e4e6e5f21861f96 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - xxhash >=0.8.3,<0.8.4.0a0 + license: BSD-2-Clause + license_family: BSD + size: 23216 + timestamp: 1740594909669 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-xxhash-3.5.0-py313h90d716c_2.conda sha256: 83d61d4b196fe03eedcd00012270990820eae6babc7d7b9901d92ada19819230 md5: 8b8baacae03389f0fa0655ad45275081 @@ -2493,6 +4684,16 @@ packages: license_family: BSD size: 21867 timestamp: 1740595184028 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-7_cp312.conda + build_number: 7 + sha256: a1bbced35e0df66cc713105344263570e835625c28d1bdee8f748f482b2d7793 + md5: 0dfcdc155cf23812a0c9deada86fb723 + constrains: + - python 3.12.* *_cpython + license: BSD-3-Clause + license_family: BSD + size: 6971 + timestamp: 1745258861359 - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-7_cp313.conda build_number: 7 sha256: 0595134584589064f56e67d3de1d8fcbb673a972946bce25fb593fb092fdcd97 @@ -2512,6 +4713,19 @@ packages: license_family: MIT size: 189015 timestamp: 1742920947249 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda + sha256: 159cba13a93b3fe084a1eb9bda0a07afc9148147647f0d437c3c3da60980503b + md5: cf2485f39740de96e2a7f2bb18ed2fee + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + size: 206903 + timestamp: 1737454910324 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.2-py313ha9b7d5b_2.conda sha256: 58c41b86ff2dabcf9ccd9010973b5763ec28b14030f9e1d9b371d22b538bce73 md5: 03a7926e244802f570f25401c25c13bc @@ -2525,6 +4739,21 @@ packages: license_family: MIT size: 194243 timestamp: 1737454911892 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.0.0-py312hbf22597_0.conda + sha256: 8564a7beb906476813a59a81a814d00e8f9697c155488dbc59a5c6e950d5f276 + md5: 4b9a9cda3292668831cf47257ade22a6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + license: BSD-3-Clause + license_family: BSD + size: 378610 + timestamp: 1749898590652 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-26.4.0-py313he6960b1_0.conda sha256: 0e0ee756e1fb46456ff398ef77dce595411043836bc47a92d30c9240c9fcef87 md5: 7f355f62656985be979c4c0003723d0a @@ -2540,6 +4769,16 @@ packages: license_family: BSD size: 369287 timestamp: 1743831518822 +- conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + sha256: 776363493bad83308ba30bcb88c2552632581b143e8ee25b1982c8c743e73abc + md5: 353823361b1d27eb3960efb076dfcaf6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: LicenseRef-Qhull + size: 552937 + timestamp: 1720813982144 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda sha256: 873ac689484262a51fd79bc6103c1a1bedbf524924d7f0088fb80703042805e4 md5: 6483b1f59526e05d7d894e466b5b6924 @@ -2549,6 +4788,14 @@ packages: license: LicenseRef-Qhull size: 516376 timestamp: 1720814307311 +- conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.06.26-h9925aae_0.conda + sha256: 7a0b82cb162229e905f500f18e32118ef581e1fd182036f3298510b8e8663134 + md5: 2b4249747a9091608dbff2bd22afde44 + depends: + - libre2-11 2025.06.26 hba17884_0 + license: BSD-3-Clause + size: 27330 + timestamp: 1751053087063 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_3.conda sha256: 248af2869bf54f77f5b4c6e144b535bbc2a6d4c27228f4fb2ed689f8df9f071b md5: d4e82bd66b71c29da35e1f634548e039 @@ -2558,6 +4805,16 @@ packages: license_family: BSD size: 26954 timestamp: 1741121389739 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c + md5: 283b96675859b20a825f8fa30f311446 + depends: + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 282480 + timestamp: 1740379431762 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h1d1bf99_2.conda sha256: 7db04684d3904f6151eff8673270922d31da1eea7fa73254d01c437f49702e34 md5: 63ef3f6e6d6d5c589e64f11263dc5676 @@ -2580,6 +4837,18 @@ packages: license_family: MIT size: 51668 timestamp: 1737836872415 +- conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2024.11.6-py312h66e93f0_0.conda + sha256: fcb5687d3ec5fff580b64b8fb649d9d65c999a91a5c3108a313ecdd2de99f06b + md5: 647770db979b43f9c9ca25dcfa7dc4e4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Python-2.0 + license_family: PSF + size: 402821 + timestamp: 1730952378415 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/regex-2024.11.6-py313h90d716c_0.conda sha256: 36723b6ff9269878ca8745dc2b85df4590e1ba2b85f66046764e01c9a9a54621 md5: bd60ec7c6eb6dcc49d37e053e7b9508a @@ -2607,6 +4876,35 @@ packages: license_family: APACHE size: 58723 timestamp: 1733217126197 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda + sha256: 9866aaf7a13c6cfbe665ec7b330647a0fb10a81e6f9b8fee33642232a1920e18 + md5: f6082eae112814f1447b56a5e1f6ed05 + depends: + - certifi >=2017.4.17 + - charset-normalizer >=2,<4 + - idna >=2.5,<4 + - python >=3.9 + - urllib3 >=1.21.1,<3 + constrains: + - chardet >=3.0.2,<6 + license: Apache-2.0 + license_family: APACHE + size: 59407 + timestamp: 1749498221996 +- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.25.1-py312h680f630_0.conda + sha256: a5b168b991c23ab6d74679a6f5ad1ed87b98ba6c383b5fe41f5f6b335b10d545 + md5: ea8f79edf890d1f9b2f1bd6fbb11be1e + depends: + - python + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + size: 391950 + timestamp: 1747837859184 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.25.1-py313hf3ab51e_0.conda sha256: 00c61b2054307fb60feaeb1d21515acb6ee917ff73cfc622fef55d4c24a32767 md5: 1df95fc541f0881e89dc4a52bd53b9ee @@ -2621,6 +4919,38 @@ packages: license_family: MIT size: 360004 timestamp: 1747837756479 +- conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.5.21-h7ab7c64_0.conda + sha256: c8b252398b502a5cc6ea506fd2fafe7e102e7c9e2ef48b7813566e8a72ce2205 + md5: 28b5a7895024a754249b2ad7de372faa + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - openssl >=3.5.0,<4.0a0 + license: Apache-2.0 + license_family: Apache + size: 358164 + timestamp: 1749095480268 +- conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py312ha707e6e_0.conda + sha256: b9faaa024b77a3678a988c5a490f02c4029c0d5903998b585100e05bc7d4ff36 + md5: 00b999c5f9d01fb633db819d79186bd4 + depends: + - __glibc >=2.17,<3.0.a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc >=13 + - libgfortran + - libgfortran5 >=13.3.0 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx >=13 + - numpy <2.5 + - numpy >=1.19,<3 + - numpy >=1.23.5 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + size: 17064784 + timestamp: 1739791925628 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.15.2-py313h9a24e0a_0.conda sha256: 2cce94fba335df6ea1c7ce5554ba8f0ef8ec0cf1a7e6918bfc2d8b2abf880794 md5: 45e6244d4265a576a299c0a1d8b09ad9 @@ -2677,6 +5007,17 @@ packages: license_family: MIT size: 16385 timestamp: 1733381032766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda + sha256: ec91e86eeb2c6bbf09d51351b851e945185d70661d2ada67204c9a6419d282d3 + md5: 3b3e64af585eadfb52bb90b553db5edf + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: BSD-3-Clause + license_family: BSD + size: 42739 + timestamp: 1733501881851 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.1-h98b9ce2_1.conda sha256: 4242f95b215127a006eb664fe26ed5a82df87e90cbdbc7ce7ff4971f0720997f md5: ded86dee325290da2967a3fea3800eb5 @@ -2717,6 +5058,24 @@ packages: license_family: MIT size: 26988 timestamp: 1733569565672 +- conda: https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.4-py312hc0a28a1_0.conda + sha256: 6cc65ba902b32207e8a697b0e0408a28d6cc166be04f1882c40739a86a253d22 + md5: 97dc960f3d9911964d73c2cf240baea5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - numpy <3,>=1.22.3 + - numpy >=1.19,<3 + - packaging >=21.3 + - pandas !=2.1.0,>=1.4 + - patsy >=0.5.6 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - scipy !=1.9.2,>=1.8 + license: BSD-3-Clause + license_family: BSD + size: 12103203 + timestamp: 1727987129263 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/statsmodels-0.14.4-py313h93df234_0.conda sha256: bd04f71d376946f21729e5b920c5722138cb12e01098ce8a3ff67e6c7bdb880c md5: 5cfb535304bfc73990e5d50184b63f0a @@ -2744,6 +5103,23 @@ packages: license_family: MIT size: 13131 timestamp: 1746039688416 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tiktoken-0.9.0-py312h14ff09d_0.conda + sha256: aba3affdd0f87e198185ddc0986aa59cb067832dc88ffa6dedbe127da4f8d7bf + md5: 0f116f56298be1450a9db6b45bd2d9a1 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - regex >=2022.1.18 + - requests >=2.26.0 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + size: 968542 + timestamp: 1739550580537 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tiktoken-0.9.0-py313h9a4dfeb_0.conda sha256: 926d4a01195b3c5f907533583ea7a935b3355823292fdc955de497dee83e12d3 md5: 860cbdef367dc46f03660c739cdd6487 @@ -2761,6 +5137,17 @@ packages: license_family: MIT size: 827611 timestamp: 1739550866069 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + sha256: a84ff687119e6d8752346d1d408d5cf360dee0badd487a472aa8ddedfdc219e1 + md5: a0116df4f4ed05c303811a837d5b39d8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + size: 3285204 + timestamp: 1748387766691 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 md5: b50a57ba89c32b62428b71a875291c9b @@ -2770,6 +5157,23 @@ packages: license_family: BSD size: 3145523 timestamp: 1699202432999 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tokenizers-0.21.2-py312h8360d73_0.conda + sha256: a54dcbed5910e0e94f7d14ec4dd0cf137a835a8c069846a9f3fc638d76a8fe52 + md5: f311d7f63df2ab7069a98f5a89f9d358 + depends: + - __glibc >=2.17,<3.0.a0 + - huggingface_hub >=0.16.4,<1.0 + - libgcc >=13 + - libstdcxx >=13 + - openssl >=3.5.0,<4.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + license: Apache-2.0 + license_family: APACHE + size: 2374175 + timestamp: 1750798318498 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tokenizers-0.21.1-py313h9a4dfeb_0.conda sha256: a314ec47e45e5d42959b4016c28137b4f868260271db1cf2a32eb4d9da65afd1 md5: 935e060488b69b7243feffd0c2f38727 @@ -2786,6 +5190,18 @@ packages: license_family: APACHE size: 2022803 timestamp: 1741890833498 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.1-py312h66e93f0_0.conda + sha256: c96be4c8bca2431d7ad7379bad94ed6d4d25cd725ae345540a531d9e26e148c9 + md5: c532a6ee766bed75c4fa0c39e959d132 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: Apache + size: 850902 + timestamp: 1748003427956 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4.2-py313h90d716c_0.conda sha256: 33ef243265af82d7763c248fedd9196523210cc295b2caa512128202eda5e9e8 md5: 6790d50f184874a9ea298be6bcbc7710 @@ -2825,6 +5241,15 @@ packages: license_family: PSF size: 89900 timestamp: 1744302253997 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.0-h32cad80_0.conda + sha256: b8cabfa54432b0f124c0af6b6facdf8110892914fa841ac2e80ab65ac52c1ba4 + md5: a1cdd40fc962e2f7944bc19e01c7e584 + depends: + - typing_extensions ==4.14.0 pyhe01879c_0 + license: PSF-2.0 + license_family: PSF + size: 90310 + timestamp: 1748959427551 - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.0-pyhd8ed1ab_0.conda sha256: 172f971d70e1dbb978f6061d3f72be463d0f629155338603450d8ffe87cbf89d md5: c5c76894b6b7bacc888ba25753bc8677 @@ -2835,6 +5260,16 @@ packages: license_family: MIT size: 18070 timestamp: 1741438157162 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.1-pyhd8ed1ab_0.conda + sha256: 4259a7502aea516c762ca8f3b8291b0d4114e094bdb3baae3171ccc0900e722f + md5: e0c3cd765dc15751ee2f0b03cd015712 + depends: + - python >=3.9 + - typing_extensions >=4.12.0 + license: MIT + license_family: MIT + size: 18809 + timestamp: 1747870776989 - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda sha256: a8aaf351e6461de0d5d47e4911257e25eec2fa409d71f3b643bb2f748bde1c08 md5: 83fc6ae00127671e301c9f44254c31b8 @@ -2845,12 +5280,34 @@ packages: license_family: PSF size: 52189 timestamp: 1744302253997 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.0-pyhe01879c_0.conda + sha256: 8561db52f278c5716b436da6d4ee5521712a49e8f3c70fcae5350f5ebb4be41c + md5: 2adcd9bb86f656d3d43bf84af59a1faf + depends: + - python >=3.9 + - python + license: PSF-2.0 + license_family: PSF + size: 50978 + timestamp: 1748959427551 - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda sha256: 5aaa366385d716557e365f0a4e9c3fca43ba196872abbbe3d56bb610d131e192 md5: 4222072737ccff51314b5ece9c7d6f5a license: LicenseRef-Public-Domain size: 122968 timestamp: 1742727099393 +- conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py312h66e93f0_0.conda + sha256: 638916105a836973593547ba5cf4891d1f2cb82d1cf14354fcef93fd5b941cdc + md5: 617f5d608ff8c28ad546e5d9671cbb95 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: Apache + size: 404401 + timestamp: 1736692621599 - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.4.0-pyhd8ed1ab_0.conda sha256: a25403b76f7f03ca1a906e1ef0f88521edded991b9897e7fed56a3e334b3db8c md5: c1e349028e0052c4eea844e94f773065 @@ -2864,6 +5321,19 @@ packages: license_family: MIT size: 100791 timestamp: 1744323705540 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + sha256: 4fb9789154bd666ca74e428d973df81087a697dbb987775bc3198d2215f240f8 + md5: 436c165519e140cb08d246a4472a9d6a + depends: + - brotli-python >=1.0.9 + - h2 >=4,<5 + - pysocks >=1.5.6,<2.0,!=1.5.7 + - python >=3.9 + - zstandard >=0.18.0 + license: MIT + license_family: MIT + size: 101735 + timestamp: 1750271478254 - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda sha256: f21e63e8f7346f9074fd00ca3b079bd3d2fa4d71f1f89d5b6934bf31446dc2a5 md5: b68980f2495d096e71c7fd9d7ccf63e6 @@ -2873,6 +5343,16 @@ packages: license_family: MIT size: 32581 timestamp: 1733231433877 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + sha256: ed10c9283974d311855ae08a16dfd7e56241fac632aec3b92e3cfe73cff31038 + md5: f6ebe2cb3f82ba6c057dde5d9debe4f7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 14780 + timestamp: 1734229004433 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h5505292_0.conda sha256: f33e6f013fc36ebc200f09ddead83468544cb5c353a3b50499b07b8c34e28a8d md5: 50901e0764b7701d8ed7343496f4f301 @@ -2882,6 +5362,16 @@ packages: license_family: MIT size: 13593 timestamp: 1734229104321 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + sha256: 6b250f3e59db07c2514057944a3ea2044d6a8cdde8a47b6497c254520fade1ee + md5: 8035c64cb77ed555e3f150b7b3972480 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 19901 + timestamp: 1727794976192 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda sha256: 9939a166d780700d81023546759102b33fdc2c5f11ef09f5f66c77210fd334c8 md5: 77c447f48cab5d3a15ac224edb86a968 @@ -2891,6 +5381,16 @@ packages: license_family: MIT size: 18487 timestamp: 1727795205022 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda + sha256: 08e12f140b1af540a6de03dd49173c0e5ae4ebc563cabdd35ead0679835baf6f + md5: 607e13a8caac17f9a664bcab5302ce06 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: BSD-2-Clause + license_family: BSD + size: 108219 + timestamp: 1746457673761 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xxhash-0.8.3-haa4e116_0.conda sha256: 5e2e58fbaa00eeab721a86cb163a54023b3b260e91293dde7e5334962c5c96e3 md5: 54a24201d62fc17c73523e4b86f71ae8 @@ -2900,6 +5400,15 @@ packages: license_family: BSD size: 98913 timestamp: 1746457827085 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + sha256: a4e34c710eeb26945bdbdaba82d3d74f60a78f54a874ec10d373811a5d217535 + md5: 4cb3ad778ec2d5a7acbdf254eb1c42ae + depends: + - libgcc-ng >=9.4.0 + license: MIT + license_family: MIT + size: 89141 + timestamp: 1641346969816 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 sha256: 93181a04ba8cfecfdfb162fc958436d868cc37db504c58078eab4c1a3e57fbb7 md5: 4bb3f014845110883a3c5ee811fd84b4 @@ -2907,6 +5416,21 @@ packages: license_family: MIT size: 88016 timestamp: 1641347076660 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.20.1-py312h178313f_0.conda + sha256: f5c2c572423fac9ea74512f96a7c002c81fd2eb260608cfa1edfaeda4d81582e + md5: 3b3fa80c71d6a8d0380e9e790f5a4a8a + depends: + - __glibc >=2.17,<3.0.a0 + - idna >=2.0 + - libgcc >=13 + - multidict >=4.0 + - propcache >=0.2.1 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: Apache + size: 149496 + timestamp: 1749555225039 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yarl-1.20.0-py313ha9b7d5b_0.conda sha256: 66377a2502615578c91fa15dcca77616931d3eab11fc02c26c149ac41bc60f3e md5: d93548f6de9809be2550b86a5377681d @@ -2922,6 +5446,19 @@ packages: license_family: Apache size: 150519 timestamp: 1744972742497 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + sha256: a4dc72c96848f764bb5a5176aa93dd1e9b9e52804137b99daeebba277b31ea10 + md5: 3947a35e916fcc6b9825449affbf4214 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + license: MPL-2.0 + license_family: MOZILLA + size: 335400 + timestamp: 1731585026517 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-hc1bb282_7.conda sha256: 9e585569fe2e7d3bea71972cd4b9f06b1a7ab8fa7c5139f92a31cbceecf25a8a md5: f7e6b65943cb73bce0143737fded08f1 @@ -2943,6 +5480,26 @@ packages: license_family: MIT size: 21809 timestamp: 1732827613585 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + sha256: 7560d21e1b021fd40b65bfb72f67945a3fcb83d78ad7ccf37b8b3165ec3b68ad + md5: df5e78d904988eb55042c0c97446079f + depends: + - python >=3.9 + license: MIT + license_family: MIT + size: 22963 + timestamp: 1749421737203 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + sha256: 5d7c0e5f0005f74112a34a7425179f4eb6e73c92f5d109e6af4ddeca407c92ab + md5: c9f075ab2f33b3bbee9e62d4ad0a6cd8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib 1.3.1 hb9d3cd8_2 + license: Zlib + license_family: Other + size: 92286 + timestamp: 1727963153079 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda sha256: 58f8860756680a4831c1bf4f294e2354d187f2e999791d53b1941834c4b37430 md5: e3170d898ca6cb48f1bb567afb92f775 @@ -2953,6 +5510,19 @@ packages: license_family: Other size: 77606 timestamp: 1727963209370 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h66e93f0_2.conda + sha256: ff62d2e1ed98a3ec18de7e5cf26c0634fd338cb87304cf03ad8cbafe6fe674ba + md5: 630db208bc7bbb96725ce9832c7423bb + depends: + - __glibc >=2.17,<3.0.a0 + - cffi >=1.11 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + size: 732224 + timestamp: 1745869780524 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py313h90d716c_2.conda sha256: 70ed0c931f9cfad3e3a75a1faf557c5fc5bf638675c6afa2fb8673e4f88fb2c5 md5: 1f465c71f83bd92cfe9df941437dcd7c @@ -2966,6 +5536,18 @@ packages: license_family: BSD size: 536612 timestamp: 1745870248616 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + sha256: a4166e3d8ff4e35932510aaff7aa90772f84b4d07e9f6f83c614cba7ceefe0eb + md5: 6432cb5d4ac0046c3ac0a8a0f95842f9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 567578 + timestamp: 1742433379869 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda sha256: 0d02046f57f7a1a3feae3e9d1aa2113788311f3cf37a3244c71e61a93177ba67 md5: e6f69c7bcccdefa417f056fa593b40f0 diff --git a/pixi.toml b/pixi.toml index c025c96..b9ec1b2 100644 --- a/pixi.toml +++ b/pixi.toml @@ -8,13 +8,15 @@ authors = [ ] channels = ["conda-forge"] name = "AutoGKB" -platforms = ["osx-arm64"] +platforms = ["osx-arm64", "linux-64"] version = "0.1.0" [tasks] download-variants = "python -m src.load_variants.load_clinical_variants" update-download-map = "python -c 'from src.fetch_articles.article_downloader import update_downloaded_pmcids; update_downloaded_pmcids()'" download-articles = "python -m src.fetch_articles.article_downloader" +download-data = "gdown --fuzzy https://drive.google.com/file/d/1qtQWvi0x_k5_JofgrfsgkWzlIdb6isr9/view && unzip autogkb-data.zip && rm autogkb-data.zip" +setup-repo = "pixi install && pixi run download-data" [dependencies] seaborn = ">=0.13.2,<0.14" diff --git a/src/components/all_associations.py b/src/components/all_associations.py new file mode 100644 index 0000000..047d7c9 --- /dev/null +++ b/src/components/all_associations.py @@ -0,0 +1,113 @@ +from src.inference import Generator +from src.variants import QuotedStr +from src.prompts import GeneratorPrompt, ArticlePrompt +from src.utils import get_article_text +from loguru import logger +import json +from typing import List, Optional, Dict +from src.config import DEBUG +from pydantic import BaseModel +import enum +import os + + +class AssociationType(enum.Enum): + DRUG = "Drug Association" + PHENOTYPE = "Phenotype Association" + FUNCTIONAL = "Functional Analysis" + + +class VariantAssociation(BaseModel): + variant: QuotedStr + gene: QuotedStr | None = None + allele: QuotedStr | None = None + association_type: AssociationType + association_summary: str + + +class VariantAssociationList(BaseModel): + association_list: List[VariantAssociation] + + +VARIANT_LIST_KEY_QUESTION = """ +In this article, find all studied associations between genetic variants (ex. rs113993960, CYP1A1*1, etc.) and a drug, phenotype, or functional analysis result. +Include information on the gene group and allele (if present). +""" + +VARIANT_LIST_OUTPUT_QUEUES = """ +Your output format should be a list of associations with the following attributes: +Variant: The Variant / Haplotypes (ex. rs2909451, CYP2C19*1, CYP2C19*2, *1/*18, etc.) +Summary: One sentence summary of the association finding for this variant. +Gene: The gene group of the variant (ex. DPP4, CYP2C19, KCNJ11, etc.) +Allele: Specific allele or genotype if different from variant (ex. TT, *1/*18, del/del, etc.). +Association Type: The type of associations the variant has in the article from the options Drug, Phenotype, or Functional. One variant may have multiple association types. More information on how to determine this below. +Quotes: A direct quote from the article that mentions this specific variant and its found association. Output the exact text where this variant is discussed (ideally in the methodology, abstract, or results section). +More than one quote can be outputted if that would be helpful but try to keep the total number fewer than 3. + +For each term except for Summary make sure to keep track of and output the exact quotes where that information is found/can be deduced. + +To determine the Association Type: + +A variant has a Drug association when the article reports associations between the genetic variant and +pharmacological parameters or clinical drug response measures that specifically relate to: +- Pharmacokinetic/Pharmacodynamic Parameters +- Clinical phenotypes/adverse events (Drug toxicity, organ dysfunction, treatment response phenotypes, disease outcomes when treated with drugs) + +A variant has a Phenotype association when the article reports associations between genetic variants and adverse drug reactions, toxicities, or clinical outcomes that represent: +- Toxicity/Safety outcomes +- Clinical phenotypes/adverse events + +A variant has a Functional association when the article contains in vitro or mechanistic functional studies that directly measure how the variant affects: +- Enzyme/transporter activity (e.g., clearance, metabolism, transport) +- Binding affinity (e.g., protein-drug interactions) +- Functional properties (e.g., uptake rates, kinetic parameters like Km/Vmax) + +The key distinction is mechanistic functional studies typically get Functional associations vs clinical association studies get Phenotype and Drug associations but Functional. +Examples: +- "Cardiotoxicity when treated with anthracyclines" → Phenotype +- "Decreased clearance of methotrexate" → Drug +- "Decreased enzyme activity in cell culture" → Functional +- "Variant affects drug clearance/response" —> Drug +- "Variant affects adverse events/toxicity outcomes" —> Phenotype +- "Variant affects protein function in laboratory studies" —> Functional +""" + + +def get_all_associations(article_text: str) -> List[Dict]: + """ + Extract all variant associations from the article + """ + prompt = GeneratorPrompt( + input_prompt=ArticlePrompt( + article_text=article_text, + key_question=VARIANT_LIST_KEY_QUESTION, + output_queues=VARIANT_LIST_OUTPUT_QUEUES, + ), + output_format_structure=VariantAssociationList, + ).get_hydrated_prompt() + generator = Generator(model="gpt-4o") + response = generator.generate(prompt) + if isinstance(response, dict): + response = VariantAssociationList(**response) + return response.association_list + return response + + +def test_all_associations(): + """ + Output the extracted variant associations to a file + """ + pmcid = "PMC4737107" + article_text = get_article_text(pmcid) + logger.info(f"Got article text {pmcid}") + associations = get_all_associations(article_text) + logger.info("Extracted associations") + file_path = f"data/extractions/all_associations/{pmcid}.jsonl" + os.makedirs(os.path.dirname(file_path), exist_ok=True) + with open(file_path, "w") as f: + json.dump(associations, f, indent=4) + logger.info(f"Saved to file {file_path}") + + +if __name__ == "__main__": + test_all_associations() diff --git a/src/components/annotations_pipeline.py b/src/components/annotations_pipeline.py new file mode 100644 index 0000000..8e6ba13 --- /dev/null +++ b/src/components/annotations_pipeline.py @@ -0,0 +1,82 @@ +from src.components.all_associations import get_all_associations, AssociationType +from src.components.drug_annotation import get_drug_annotation +from src.components.phenotype_annotation import get_phenotype_annotation +from src.components.functional_annotation import get_functional_annotation +from src.components.study_parameters import get_study_parameters +from src.utils import get_article_text, is_pmcid, get_title +from typing import Optional +from loguru import logger +from pathlib import Path + + +class AnnotationPipeline: + def __init__(self, pmcid: str): + if not is_pmcid(pmcid): + logger.error(f"Invalid PMCID: {pmcid}") + self.pmcid = pmcid + self.article_text = get_article_text(pmcid) + self.title = get_title(self.article_text) + self.all_associations = [] + self.study_parameters = {} + self.drug_annotations = [] + self.phenotye_annotations = [] + self.functional_annotations = [] + + def print_info(self): + logger.info(f"Found {len(self.all_associations)} associations") + logger.info(f"Created {len(self.drug_annotations)} Drug Annotations") + logger.info(f"Created {len(self.phenotye_annotations)} Phenotype Annotations") + logger.info( + f"Created {len(self.functional_annotations)} Functional Annotations" + ) + + def generate_final_structure(self): + return { + "pmcid": self.pmcid, + "title": self.title, + "study_parameters": self.study_parameters, + "drug_annotations": self.drug_annotations, + "phenotype_annotations": self.phenotye_annotations, + "functional_annotations": self.functional_annotations, + } + + def run(self, save_path: str = "data/extractions"): + logger.info("Getting Study Parameters") + self.study_parameters = get_study_parameters(self.article_text) + + logger.info("Getting All Associations") + self.all_associations = get_all_associations(self.article_text) + + for association in self.all_associations: + if association.association_type == AssociationType.DRUG: + self.drug_annotations.append(get_drug_annotation(association)) + if association.association_type == AssociationType.PHENOTYPE: + self.phenotye_annotations.append(get_phenotype_annotation(association)) + if association.association_type == AssociationType.FUNCTIONAL: + self.functional_annotations.append( + get_functional_annotation(association) + ) + + self.print_info() + + final_structure = self.generate_final_structure() + logger.info("Generated complete annotation") + + if save_path: + file_path = Path(save_path) / f"{self.pmcid}.json" + import os + import json + + os.makedirs(os.path.dirname(file_path), exist_ok=True) + try: + with open(file_path, "w") as f: + json.dump(final_structure, f, indent=4) + logger.info(f"Saved annotations to {file_path}") + except Exception as e: + logger.error(f"Error saving annotations: {e}") + return final_structure + + +if __name__ == "__main__": + pipeline = AnnotationPipeline("PMC11730665") + pipeline.run() diff --git a/src/components/all_variants.py b/src/components/deprecated/all_variants.py similarity index 85% rename from src/components/all_variants.py rename to src/components/deprecated/all_variants.py index e076cfb..0ac1cd2 100644 --- a/src/components/all_variants.py +++ b/src/components/deprecated/all_variants.py @@ -4,10 +4,11 @@ from src.utils import get_article_text from loguru import logger import json -from typing import List +from typing import List, Optional from src.config import DEBUG -VARIANT_LIST_KEY_QUESTION = """From this article, note down ALL discussed variants/haplotypes (ex. rs113993960, CYP1A1*1, etc.). Include information on the gene group and allele (if present). +VARIANT_LIST_KEY_QUESTION = """ +From this article, note down ALL discussed variants/haplotypes (ex. rs113993960, CYP1A1*1, etc.). Include information on the gene group and allele (if present). Make sure they variant has a studied association (likely discussed in the methodology or results section), not simply mentioned as background information. """ @@ -22,8 +23,8 @@ def extract_all_variants( - article_text: str = None, - pmcid: str = None, + article_text: Optional[str] = None, + pmcid: Optional[str] = None, model: str = "gpt-4o", temperature: float = 0.1, ) -> List[Variant]: @@ -41,7 +42,7 @@ def extract_all_variants( logger.debug(f"Model: {model}, Temperature: {temperature}") logger.debug(f"PMCID: {pmcid}") - model = Generator(model=model, temperature=temperature) + generator = Generator(model=model, temperature=temperature) prompt_variables = PromptVariables( article_text=article_text, key_question=VARIANT_LIST_KEY_QUESTION, @@ -51,7 +52,7 @@ def extract_all_variants( prompt_generator = GeneratorPrompt(prompt_variables) hydrated_prompt = prompt_generator.hydrate_prompt() logger.info(f"Extracting all variants") - output = model.prompted_generate(hydrated_prompt) + output = generator.prompted_generate(hydrated_prompt) if DEBUG: logger.debug(f"Raw LLM output: {output}") parsed_output = json.loads(output) @@ -65,7 +66,10 @@ def extract_all_variants( def main( - pmcid: str, model: str = "gpt-4o", temperature: float = 0.1, output: str = None + pmcid: str, + model: str = "gpt-4o", + temperature: float = 0.1, + output: Optional[str] = None, ): """Main function to demonstrate variant extraction functionality.""" try: diff --git a/src/components/association_types.py b/src/components/deprecated/association_types.py similarity index 93% rename from src/components/association_types.py rename to src/components/deprecated/association_types.py index ead9d60..77c63ec 100644 --- a/src/components/association_types.py +++ b/src/components/deprecated/association_types.py @@ -3,7 +3,7 @@ """ from src.variants import Variant -from typing import List +from typing import List, Optional from src.prompts import PromptVariables, GeneratorPrompt, ParserPrompt from src.inference import Generator, Parser from pydantic import BaseModel @@ -29,15 +29,9 @@ class AssociationType(BaseModel): """ variant: Variant - drug_association: bool - drug_association_explanation: str - drug_association_quote: str - phenotype_association: bool - phenotype_association_explanation: str - phenotype_association_quote: str - functional_association: bool - functional_association_explanation: str - functional_association_quote: str + association_type: List[str] + explanation: str + quotes: List[str] class AssociationTypeList(BaseModel): @@ -95,8 +89,10 @@ class AssociationTypeList(BaseModel): def get_association_types( - variants: List[Variant], article_text: str = None, pmcid: str = None -) -> List[AssociationType]: + variants: List[Variant], + article_text: Optional[str] = None, + pmcid: Optional[str] = None, +) -> Optional[List[AssociationType]]: article_text = get_article_text(pmcid=pmcid, article_text=article_text) variant_id_list = [variant.variant_id for variant in variants] prompt_variables = PromptVariables( @@ -120,7 +116,7 @@ def get_association_types( output_format_structure=AssociationTypeList, system_prompt=generator_prompt.system_prompt, ) - parsed_response = parser.prompted_generate(parser_prompt) + parsed_response = parser.prompted_generate(parser_prompt.hydrate_prompt()) # Parse the string response into AssociationType objects try: diff --git a/src/components/deprecated/functional_annotation_extraction.py b/src/components/deprecated/functional_annotation_extraction.py new file mode 100644 index 0000000..35ea98e --- /dev/null +++ b/src/components/deprecated/functional_annotation_extraction.py @@ -0,0 +1,204 @@ +""" +Extract detailed functional annotation information for variants with functional associations. +""" + +from typing import List +from loguru import logger +from pydantic import BaseModel +from src.variants import Variant, FunctionalAnnotation, FunctionalAnnotationList +from src.prompts import PromptVariables, GeneratorPrompt, ParserPrompt +from src.inference import Generator, Parser +from src.utils import get_article_text +from src.config import DEBUG +import json +import time +import random + + +KEY_QUESTION = """ +For the following variants that have been identified as having functional associations, extract detailed mechanistic annotation information. + +Variants: {variants} + +Extract the following information for each variant: + +Term: Variant/Haplotypes +- Content: The specific genetic variant studied +- Example: CYP2C19*1, CYP2C19*17, rs72552763, CYP2B6*1, CYP2B6*6 + +Term: Gene +- Content: Gene symbol associated with the variant +- Example: CYP2C19, CYP2B6, SLC22A1 + +Term: Drug(s) +- Content: Substrate or compound used in the functional assay +- Example: normeperidine, bupropion, warfarin, voriconazole, ranitidine + +Term: Phenotype Category +- Content: Type of functional outcome measured (EXACTLY ONE: "Metabolism/PK", "Efficacy", or leave empty) +- Example: Metabolism/PK (for enzyme kinetics), Efficacy (for cellular response) + +Term: Significance +- Content: Statistical significance of functional differences (EXACTLY ONE: "yes", "no", "not stated") +- Example: yes (for significant activity differences), not stated (for descriptive studies) + +Term: Notes +- Content: Key experimental details, methodology, quantitative results +- Example: "Clearance was 26.57% of wild-type. CYP2C19 variants expressed in Sf21 insect cells..." + +Term: Sentence +- Content: Standardized description of the functional relationship +- Format: "[Variant] is associated with [increased/decreased] [functional outcome] [experimental context] as compared to [reference variant]" +- Example: "CYP2C19 *17/*17 is associated with increased formation of normeperidine as compared to CYP2C19 *1/*1 + *1/*17." + +Term: Alleles +- Content: Specific allele or genotype tested +- Example: *17/*17, *1/*1, del, A + +Term: Specialty Population +- Content: Age-specific populations (rarely applicable to functional studies, usually empty) + +Term: Assay type +- Content: Laboratory method or experimental system used +- Example: in human liver microsomes, hydroxylation assay, crystal structure prediction, Cells + +Term: Metabolizer types +- Content: Phenotype classification if applicable (rarely used in functional studies) +- Example: Usually empty + +Term: isPlural +- Content: Grammar helper for sentence construction (EXACTLY ONE: "Is", "Are") +- Example: Is + +Term: Is/Is Not associated +- Content: Direction of functional association (EXACTLY ONE: "Associated with", "Not associated with") + +Term: Direction of effect +- Content: Whether the variant increases or decreases function (EXACTLY ONE: "increased", "decreased") +- Example: increased (for enhanced activity), decreased (for reduced activity) + +Term: Functional terms +- Content: Specific functional outcome measured +- Example: formation of, activity of, clearance of, transport of, affinity to, catalytic activity of + +Term: Gene/gene product +- Content: Specific gene or protein being functionally assessed +- Example: CYP2C19, CYP2B6, CYP2C9 + +Term: When treated with/exposed to/when assayed with +- Content: Experimental substrate context +- Example: when assayed with, of, or leave empty + +Term: Multiple drugs And/or +- Content: Logical connector for multiple substrates (EXACTLY ONE: "and", "or", or leave empty) + +Term: Cell type +- Content: Cell line or tissue system used for the assay +- Example: in 293FT cells, expressed in COS-7 cells, Sf21 insect cells, in insect microsomes + +Term: Comparison Allele(s) or Genotype(s) +- Content: Reference variant for comparison +- Example: *1/*1 + *1/*17, *1, GAT + +Term: Comparison Metabolizer types +- Content: Reference metabolizer status (usually empty for functional studies) +""" + +OUTPUT_QUEUES = """ +For each variant, extract all the above information and provide it in structured format. Generate a unique Variant Annotation ID using timestamp + random numbers. + +For each variant, provide: +- All required fields filled with appropriate values or left empty if not applicable +- Ensure controlled vocabulary compliance for categorical fields +- Extract direct quotes from the article to support the annotations +""" + + +def extract_functional_annotations( + variants: List[Variant], article_text: str = None, pmcid: str = None +) -> List[FunctionalAnnotation]: + """ + Extract detailed functional annotation information for variants with functional associations. + Processes each variant individually for better control and cleaner extraction. + + Args: + variants: List of variants that have functional associations + article_text: The text of the article + pmcid: The PMCID of the article + + Returns: + List of FunctionalAnnotation objects with detailed information + """ + article_text = get_article_text(pmcid=pmcid, article_text=article_text) + variant_id_list = [variant.variant_id for variant in variants] + + logger.info( + f"Extracting functional annotations for {len(variants)} variants individually: {variant_id_list}" + ) + + all_annotations = [] + + for variant in variants: + logger.info(f"Processing variant: {variant.variant_id}") + + class SingleFunctionalAnnotation(BaseModel): + functional_annotation: FunctionalAnnotation + + prompt_variables = PromptVariables( + article_text=article_text, + key_question=KEY_QUESTION.format(variants=[variant]), + output_queues=OUTPUT_QUEUES, + output_format_structure=SingleFunctionalAnnotation, + ) + + prompt_generator = GeneratorPrompt(prompt_variables) + generator_prompt = prompt_generator.hydrate_prompt() + + generator = Generator(model="gpt-4o-mini", temperature=0.1) + response = generator.prompted_generate(generator_prompt) + + parser = Parser(model="gpt-4o-mini", temperature=0.1) + parser_prompt = ParserPrompt( + input_prompt=response, + output_format_structure=SingleFunctionalAnnotation, + system_prompt=generator_prompt.system_prompt, + ) + parsed_response = parser.prompted_generate(parser_prompt) + + try: + parsed_data = json.loads(parsed_response) + + if isinstance(parsed_data, dict) and "functional_annotation" in parsed_data: + annotation_data = parsed_data["functional_annotation"] + elif isinstance(parsed_data, dict): + annotation_data = parsed_data + else: + logger.warning( + f"Unexpected response format for variant {variant.variant_id}: {parsed_data}" + ) + continue + + if ( + "variant_annotation_id" not in annotation_data + or not annotation_data["variant_annotation_id"] + ): + annotation_data["variant_annotation_id"] = int( + str(int(time.time())) + str(random.randint(100000, 999999)) + ) + + annotation = FunctionalAnnotation(**annotation_data) + all_annotations.append(annotation) + logger.info( + f"Successfully extracted functional annotation for variant {variant.variant_id}" + ) + + except (json.JSONDecodeError, TypeError, ValueError) as e: + logger.error( + f"Failed to parse functional annotation response for variant {variant.variant_id}: {e}" + ) + continue + + logger.info( + f"Successfully extracted {len(all_annotations)} functional annotations from {len(variants)} variants" + ) + return all_annotations diff --git a/src/components/deprecated/phenotype_annotation_extraction.py b/src/components/deprecated/phenotype_annotation_extraction.py new file mode 100644 index 0000000..3ec422f --- /dev/null +++ b/src/components/deprecated/phenotype_annotation_extraction.py @@ -0,0 +1,210 @@ +""" +Extract detailed phenotype annotation information for variants with phenotype associations. +""" + +from typing import List +from loguru import logger +from pydantic import BaseModel +from src.variants import Variant, PhenotypeAnnotation, PhenotypeAnnotationList +from src.prompts import PromptVariables, GeneratorPrompt, ParserPrompt +from src.inference import Generator, Parser +from src.utils import get_article_text +from src.config import DEBUG +import json +import time +import random + + +KEY_QUESTION = """ +For the following variants that have been identified as having phenotype associations, extract detailed pharmacogenomic annotation information. + +Variants: {variants} + +Extract the following information for each variant: + +Term: Variant/Haplotypes +- Content: The specific genetic variant mentioned in the study +- Example: HLA-B*35:08, rs1801272, UGT1A1*28 + +Term: Gene +- Content: Gene symbol associated with the variant +- Example: HLA-B, CYP2A6, UGT1A1 + +Term: Drug(s) +- Content: Drug(s) that caused or were involved in the phenotype +- Example: lamotrigine, sacituzumab govitecan, empty for disease predisposition + +Term: Phenotype Category +- Content: Type of phenotype or outcome studied (EXACTLY ONE: "Toxicity", "Efficacy", "Metabolism/PK", "Dosage", "Other") +- Example: Toxicity + +Term: Significance +- Content: Whether the association was statistically significant (EXACTLY ONE: "yes", "no", "not stated") +- Example: yes + +Term: Notes +- Content: Key study details, statistics, methodology +- Example: "The allele was not significant when comparing allele frequency in cases..." + +Term: Sentence +- Content: Standardized description of the genetic-phenotype association +- Format: "[Variant] is [associated with/not associated with] [increased/decreased] [phenotype outcome] [drug context] [population context]" +- Example: "HLA-B *35:08 is not associated with likelihood of Maculopapular Exanthema, severe cutaneous adverse reactions or Stevens-Johnson Syndrome when treated with lamotrigine in people with Epilepsy." + +Term: Alleles +- Content: Specific allele or genotype if different from main variant field +- Example: *35:08, AA + AT, *1/*28 + *28/*28 + +Term: Specialty Population +- Content: Age-specific populations (EXACTLY ONE: "Pediatric", "Geriatric", or leave empty) + +Term: Metabolizer types +- Content: CYP enzyme phenotype when applicable +- Example: ultrarapid metabolizer, intermediate activity + +Term: isPlural +- Content: Grammar helper for sentence construction (EXACTLY ONE: "Is", "Are") +- Example: Is (for single allele), Are (for combined genotypes) + +Term: Is/Is Not associated +- Content: Direction of statistical association (EXACTLY ONE: "Associated with", "Not associated with") + +Term: Direction of effect +- Content: Whether the variant increases or decreases the phenotype (EXACTLY ONE: "increased", "decreased", or leave empty) + +Term: Side effect/efficacy/other +- Content: Specific outcome descriptor +- Example: likelihood of, risk of + +Term: Phenotype +- Content: Primary phenotype with standardized prefix +- Example: Side Effect:Maculopapular Exanthema, Disease:Epilepsy + +Term: Multiple phenotypes And/or +- Content: Logical connector for multiple phenotypes (EXACTLY ONE: "and", "or", or leave empty) + +Term: When treated with/exposed to/when assayed with +- Content: Drug administration context +- Example: when treated with, when exposed to + +Term: Multiple drugs And/or +- Content: Logical connector for multiple drugs (EXACTLY ONE: "and", "or", or leave empty) + +Term: Population types +- Content: Descriptor of study population +- Example: in people with + +Term: Population Phenotypes or diseases +- Content: Disease/condition context with standardized prefix +- Example: Disease:Epilepsy, Other:Diabetes Mellitus, Type 2 + +Term: Multiple phenotypes or diseases And/or +- Content: Logical connector for multiple conditions (EXACTLY ONE: "and", "or", or leave empty) + +Term: Comparison Allele(s) or Genotype(s) +- Content: Reference genotype used for comparison +- Example: *1/*1, C + +Term: Comparison Metabolizer types +- Content: Reference metabolizer status for comparison +- Example: normal metabolizer +""" + +OUTPUT_QUEUES = """ +For each variant, extract all the above information and provide it in structured format. Generate a unique Variant Annotation ID using timestamp + random numbers. + +For each variant, provide: +- All required fields filled with appropriate values or left empty if not applicable +- Ensure controlled vocabulary compliance for categorical fields +- Extract direct quotes from the article to support the annotations +""" + + +def extract_phenotype_annotations( + variants: List[Variant], article_text: str = None, pmcid: str = None +) -> List[PhenotypeAnnotation]: + """ + Extract detailed phenotype annotation information for variants with phenotype associations. + Processes each variant individually for better control and cleaner extraction. + + Args: + variants: List of variants that have phenotype associations + article_text: The text of the article + pmcid: The PMCID of the article + + Returns: + List of PhenotypeAnnotation objects with detailed information + """ + article_text = get_article_text(pmcid=pmcid, article_text=article_text) + variant_id_list = [variant.variant_id for variant in variants] + + logger.info( + f"Extracting phenotype annotations for {len(variants)} variants individually: {variant_id_list}" + ) + + all_annotations = [] + + for variant in variants: + logger.info(f"Processing variant: {variant.variant_id}") + + class SinglePhenotypeAnnotation(BaseModel): + phenotype_annotation: PhenotypeAnnotation + + prompt_variables = PromptVariables( + article_text=article_text, + key_question=KEY_QUESTION.format(variants=[variant]), + output_queues=OUTPUT_QUEUES, + output_format_structure=SinglePhenotypeAnnotation, + ) + + prompt_generator = GeneratorPrompt(prompt_variables) + generator_prompt = prompt_generator.hydrate_prompt() + + generator = Generator(model="gpt-4o-mini", temperature=0.1) + response = generator.prompted_generate(generator_prompt) + + parser = Parser(model="gpt-4o-mini", temperature=0.1) + parser_prompt = ParserPrompt( + input_prompt=response, + output_format_structure=SinglePhenotypeAnnotation, + system_prompt=generator_prompt.system_prompt, + ) + parsed_response = parser.prompted_generate(parser_prompt) + + try: + parsed_data = json.loads(parsed_response) + + if isinstance(parsed_data, dict) and "phenotype_annotation" in parsed_data: + annotation_data = parsed_data["phenotype_annotation"] + elif isinstance(parsed_data, dict): + annotation_data = parsed_data + else: + logger.warning( + f"Unexpected response format for variant {variant.variant_id}: {parsed_data}" + ) + continue + + if ( + "variant_annotation_id" not in annotation_data + or not annotation_data["variant_annotation_id"] + ): + annotation_data["variant_annotation_id"] = int( + str(int(time.time())) + str(random.randint(100000, 999999)) + ) + + annotation = PhenotypeAnnotation(**annotation_data) + all_annotations.append(annotation) + logger.info( + f"Successfully extracted phenotype annotation for variant {variant.variant_id}" + ) + + except (json.JSONDecodeError, TypeError, ValueError) as e: + logger.error( + f"Failed to parse phenotype annotation response for variant {variant.variant_id}: {e}" + ) + continue + + logger.info( + f"Successfully extracted {len(all_annotations)} phenotype annotations from {len(variants)} variants" + ) + return all_annotations diff --git a/src/components/variant_association_pipeline.py b/src/components/deprecated/variant_association_pipeline.py similarity index 67% rename from src/components/variant_association_pipeline.py rename to src/components/deprecated/variant_association_pipeline.py index 36882f5..5132c46 100644 --- a/src/components/variant_association_pipeline.py +++ b/src/components/deprecated/variant_association_pipeline.py @@ -14,8 +14,18 @@ from typing import Dict, List, Optional from loguru import logger -from src.components.all_variants import extract_all_variants -from src.components.association_types import get_association_types, AssociationType +from src.components.deprecated.all_variants import extract_all_variants +from src.components.deprecated.association_types import ( + get_association_types, + AssociationType, +) +from src.components.drug_annotation import extract_drug_annotations +from src.components.deprecated.phenotype_annotation_extraction import ( + extract_phenotype_annotations, +) +from src.components.deprecated.functional_annotation_extraction import ( + extract_functional_annotations, +) from src.utils import get_article_text from src.variants import Variant @@ -30,7 +40,7 @@ def __init__(self, model: str = "gpt-4o-mini", temperature: float = 0.1): self.temperature = temperature def process_article( - self, article_text: str = None, pmcid: str = None + self, article_text: Optional[str] = None, pmcid: Optional[str] = None ) -> Dict[str, List[Variant]]: """ Process an article to extract variants and determine their association types. @@ -40,7 +50,7 @@ def process_article( pmcid: The PMCID of the article Returns: - Dictionary with lists of variants for each association type + Dictionary with lists of variants for each association type and detailed drug annotations """ # Get article text article_text = get_article_text(pmcid=pmcid, article_text=article_text) @@ -58,6 +68,9 @@ def process_article( "drug_associations": [], "phenotype_associations": [], "functional_associations": [], + "drug_annotations": [], + "phenotype_annotations": [], + "functional_annotations": [], } # Step 2: Determine association types for all variants @@ -70,16 +83,55 @@ def process_article( "drug_associations": [], "phenotype_associations": [], "functional_associations": [], + "drug_annotations": [], + "phenotype_annotations": [], + "functional_annotations": [], } # Step 3: Categorize variants by association type logger.info("Step 3: Categorizing variants by association type") result = self._categorize_variants(variants, association_types_result) + drug_annotations = [] + phenotype_annotations = [] + functional_annotations = [] + + if result["drug_associations"]: + logger.info("Step 4a: Extracting detailed drug annotations") + drug_annotations = extract_drug_annotations( + result["drug_associations"], article_text, pmcid + ) + logger.info(f"Extracted {len(drug_annotations)} detailed drug annotations") + + if result["phenotype_associations"]: + logger.info("Step 4b: Extracting detailed phenotype annotations") + phenotype_annotations = extract_phenotype_annotations( + result["phenotype_associations"], article_text, pmcid + ) + logger.info( + f"Extracted {len(phenotype_annotations)} detailed phenotype annotations" + ) + + if result["functional_associations"]: + logger.info("Step 4c: Extracting detailed functional annotations") + functional_annotations = extract_functional_annotations( + result["functional_associations"], article_text, pmcid + ) + logger.info( + f"Extracted {len(functional_annotations)} detailed functional annotations" + ) + + result["drug_annotations"] = drug_annotations + result["phenotype_annotations"] = phenotype_annotations + result["functional_annotations"] = functional_annotations + logger.info( f"Final categorization: {len(result['drug_associations'])} drug, " f"{len(result['phenotype_associations'])} phenotype, " - f"{len(result['functional_associations'])} functional associations" + f"{len(result['functional_associations'])} functional associations, " + f"{len(result['drug_annotations'])} detailed drug annotations, " + f"{len(result['phenotype_annotations'])} detailed phenotype annotations, " + f"{len(result['functional_annotations'])} detailed functional annotations" ) return result @@ -145,11 +197,11 @@ def _categorize_variants( def run_variant_association_pipeline( - article_text: str = None, - pmcid: str = None, + article_text: Optional[str] = None, + pmcid: Optional[str] = None, model: str = "gpt-4o-mini", temperature: float = 0.1, -) -> Dict[str, List[Variant]]: +) -> Dict[str, List]: """ Convenience function to run the variant association pipeline. @@ -160,7 +212,7 @@ def run_variant_association_pipeline( temperature: The temperature for LLM generation Returns: - Dictionary with lists of variants for each association type + Dictionary with lists of variants for each association type and detailed drug annotations """ pipeline = VariantAssociationPipeline(model=model, temperature=temperature) return pipeline.process_article(article_text=article_text, pmcid=pmcid) diff --git a/src/components/drug_annotation.py b/src/components/drug_annotation.py new file mode 100644 index 0000000..dceaf73 --- /dev/null +++ b/src/components/drug_annotation.py @@ -0,0 +1,166 @@ +""" +Extract detailed drug annotation information for variants with drug associations. +""" + +from typing import Optional, Dict +from loguru import logger +from pydantic import BaseModel +from src.variants import QuotedStr, QuotedList +from src.components.all_associations import ( + VariantAssociation, + get_all_associations, + AssociationType, +) +from src.prompts import GeneratorPrompt, PromptHydrator +from src.inference import Generator +from src.utils import get_article_text +from src.config import DEBUG +import json +import os + +""" +Terms: +- Drug(s): +- Phenotype Category +- Association Significane +- Sentence Summary (get examples) +- Specialty Populations +- Notes: 3-4 sentence summary of the results of the study in relation to these variant and the found association. + +Explain your reasoning step by step by including the term, a one sentence explanation, and an exact quote from the article that details where +""" + + +class DrugAnnotation(BaseModel): + associated_drugs: QuotedList + association_significance: QuotedStr + meatbolizer_info: Optional[QuotedStr] + specialty_populations: QuotedStr + sentence_summary: str + notes: Optional[str] + + +def get_association_background_prompt(variant_association: VariantAssociation): + background_prompt = "" + background_prompt += f"Variant ID: {variant_association.variant.content}\n" + background_prompt += ( + f"Association Summary: {variant_association.association_summary}\n" + ) + return background_prompt + + +""" +Old Terms +Term: Variant/Haplotypes +- Content: The specific genetic variant mentioned in the study +- Exampls: rs2909451, CYP2C19*1, CYP2C19*2, *1/*18 + +Term: Gene +- Content: HGNC symbol for the gene involved in the association. Typically the variants will be within the gene +boundaries, but occasionally this will not be true. E.g. the variant in the annotation may be upstream of the gene but +is reported to affect the gene's expression or otherwise associated with the gene. +- Exampls: DPP4, CYP2C19, KCNJ11 +""" + +KEY_QUESTION = """ +This article contains information on the following variant association: +{association_background} + +We are trying to complete a Drug Annotation report that is speciically interested in associations between genetic variants and +pharmacological parameters or clinical drug response measures. + +For this association, use the article the find the following additional information for us to get a complete undestanding of the findings: + +Term: Drug(s) +- Content: Nme(s) of the drug(s) associated with the variant as part of this association along with a one sentence +description of the results. Convert the drug names to their generic before outputting if possible but include the original term in parentheses. + +Term: Phenotype Category +- Content: Type of clinical outcome studied (EXACTLY ONE: "Efficacy", "Metabolism/PK", "Toxicity", "Dosage", "Other") +- Example: Efficacy + +Term: Metabolizer Info (Optional) +- Content: If the study describes a metabolism relationship, describe the CYP enzyme phenotype categories and how they were created/defined. +For example, if the study references a "poor metabolizer" define poor metabolizer as well as the reference metabolizer types. If +the study is not metabolism related, output None or ignore this term. + +Term: Significance +- Content: Was this association statistically significant? Describe the author's reported p-value or relevant statistical values. + +Term: Specialty Population +- Content: Was an age-specific population studied as part of this association? (EXACTLY ONE: "Pediatric", "Geriatric", "No", or "Unknown") + +Term: Sentence +- Content: One sentence summary of the association. Make sure to include the following information roughly by following this +rough format: "[Genotype/Allele/Variant] is [associated with/not associated with] [increased/decreased] [outcome] [drug context] [population context]" +- Example: "Genotype TT is associated with decreased response to sitagliptin in people with Diabetes Mellitus, Type 2." + +Term: Notes +- Content: Any additional key study details, methodology, or important context +- Example: "Patients with the rs2909451 TT genotype in the study group exhibited a median HbA1c improvement of 0.57..." +""" + +OUTPUT_QUEUES = """ +For each variant, extract all the above information and provide it in structured format + +For each variant, provide: +- All required fields filled with appropriate values or left empty if not applicable +- Ensure controlled vocabulary compliance for categorical fields +- Extract direct quotes from the article to support the annotations +""" + + +def get_drug_annotation(variant_association: VariantAssociation | Dict): + if isinstance(variant_association, dict): + variant_association = VariantAssociation(**variant_association) + prompt = GeneratorPrompt( + input_prompt=PromptHydrator( + prompt_template=KEY_QUESTION, + prompt_variables={ + "association_background": get_association_background_prompt( + variant_association + ), + }, + system_prompt=None, + output_format_structure=DrugAnnotation, + ), + output_format_structure=DrugAnnotation, + ).get_hydrated_prompt() + generator = Generator(model="gpt-4o") + return generator.generate(prompt) + + +def test_drug_annotations(): + """ + Output the extracted variant associations to a file + """ + pmcid = "PMC11730665" + article_text = get_article_text(pmcid) + logger.info(f"Got article text {pmcid}") + associations = get_all_associations(article_text) + + # Save associations + file_path = f"data/extractions/{pmcid}/associations.jsonl" + os.makedirs(os.path.dirname(file_path), exist_ok=True) + with open(file_path, "w") as f: + json.dump(associations, f, indent=4) + logger.info(f"Saved to file {file_path}") + + logger.info(f"Found {len(associations)} associations") + associations = [VariantAssociation(**association) for association in associations] + drug_annotations = [] + for association in associations: + if association.association_type == AssociationType.DRUG: + drug_annotation = get_drug_annotation(association) + drug_annotations.append(drug_annotation) + + logger.info(f"Got drug annotations for {len(drug_annotations)} associations") + file_path = f"data/extractions/{pmcid}/drug_annotation.jsonl" + os.makedirs(os.path.dirname(file_path), exist_ok=True) + with open(file_path, "w") as f: + json.dump(drug_annotations, f, indent=4) + logger.info(f"Saved to file {file_path}") + + +if __name__ == "__main__": + test_drug_annotations() diff --git a/src/components/functional_annotation.py b/src/components/functional_annotation.py new file mode 100644 index 0000000..40bbbf1 --- /dev/null +++ b/src/components/functional_annotation.py @@ -0,0 +1,154 @@ +""" +Extract detailed drug annotation information for variants with drug associations. +""" + +from typing import List, Optional, Dict +import os +from loguru import logger +from pydantic import BaseModel +from src.variants import Variant, QuotedStr, QuotedList +from src.components.all_associations import ( + VariantAssociation, + get_all_associations, + AssociationType, +) +from src.prompts import PromptHydrator, GeneratorPrompt +from src.inference import Generator +from src.utils import get_article_text +from src.config import DEBUG +import json + +""" +Terms: +- Drug(s): +- Phenotype Category +- Association Significane +- Sentence Summary (get examples) +- Specialty Populations +- Notes: 3-4 sentence summary of the results of the study in relation to these variant and the found association. + +Explain your reasoning step by step by including the term, a one sentence explanation, and an exact quote from the article that details where +""" + + +class FunctionalAnnotation(BaseModel): + associated_drugs: QuotedList + association_significance: QuotedStr + specialty_populations: QuotedStr + assay_type: QuotedStr + cell_type: QuotedStr + sentence_summary: str + notes: Optional[str] + + +def get_association_background_prompt(variant_association: VariantAssociation): + background_prompt = "" + background_prompt += f"Variant ID: {variant_association.variant.content}\n" + background_prompt += ( + f"Association Summary: {variant_association.association_summary.content}\n" + ) + return background_prompt + + +KEY_QUESTION = """ +This article contains information on the following variant association: +{association_background} + +We are interested in completing a Functional Annotation report that is specifically interested in associations between genetic variants +and in-vitro outcomes such as: +- Enzyme/transporter activity (e.g., clearance, metabolism, transport) +- Binding affinity (e.g., protein-drug interactions) +- Functional properties (e.g., uptake rates, kinetic parameters like Km/Vmax) + +Term: Drug(s) +- Content: Nme(s) of the drug(s) associated with the variant as part of this association along with a one sentence +description of the results. Convert the drug names to their generic before outputting if possible but include the original term in parentheses. + +Term: Phenotype Category +- Content: Type of clinical outcome studied (EXACTLY ONE: "Efficacy", "Metabolism/PK", "Toxicity", "Dosage", "Other: ") + +Term: Assay Type +- Content: Laboratory method or experimental system used to measure this association. +- Example: hydroxylation assay, crystal structure prediction, etc. + +Term: Cell Type +- Content: The cell type(s) used in the assay for this association. Include species context if available +- Example: insect microsomes, human hepatocytes, E. coli DH5alpha, etc. + +Term: Significance +- Content: Was this association statistically significant? Describe the author's reported p-value or relevant statistical values. + +Term: Sentence +- Content: One sentence summary of the association. Make sure to include the following information roughly by following this +rough format: "[Genotype/Allele/Variant] is [associated with/not associated with] [increased/decreased] [outcome] [drug context] [population context]" +- Example: "Genotype TT is associated with decreased response to sitagliptin in people with Diabetes Mellitus, Type 2." + +Term: Notes +- Content: Any additional key study details, methodology, or important context +- Example: "TPMT protein levels were comparable between TPMT*3C and TPMT*1 when expressed in yeast. Comparable results were seen in COS-1 cells. mRNA levels were comparable between *3C and *1 in yeast." +""" + +OUTPUT_QUEUES = """ +For each variant, extract all the above information and provide it in structured format + +For each variant, provide: +- All required fields filled with appropriate values or left empty if not applicable +- Ensure controlled vocabulary compliance for categorical fields +- Extract direct quotes from the article to support the annotations +""" + + +def get_functional_annotation(variant_association: VariantAssociation | Dict): + if isinstance(variant_association, dict): + variant_association = VariantAssociation(**variant_association) + prompt = GeneratorPrompt( + input_prompt=PromptHydrator( + prompt_template=KEY_QUESTION, + prompt_variables={ + "association_background": get_association_background_prompt( + variant_association + ), + }, + system_prompt=None, + output_format_structure=FunctionalAnnotation, + ), + output_format_structure=FunctionalAnnotation, + ).get_hydrated_prompt() + generator = Generator(model="gpt-4o") + return generator.generate(prompt) + + +def test_functional_annotations(): + """ + Output the extracted variant associations to a file + """ + pmcid = "PMC11730665" + article_text = get_article_text(pmcid) + logger.info(f"Got article text {pmcid}") + associations = get_all_associations(article_text) + + # Save associations + file_path = f"data/extractions/{pmcid}/associations.jsonl" + os.makedirs(os.path.dirname(file_path), exist_ok=True) + with open(file_path, "w") as f: + json.dump(associations, f, indent=4) + logger.info(f"Saved to file {file_path}") + + logger.info(f"Found {len(associations)} associations") + associations = [VariantAssociation(**association) for association in associations] + functional_annotations = [] + for association in associations: + if association.association_type == AssociationType.FUNCTIONAL: + functional_annotation = get_functional_annotation(association) + functional_annotations.append(functional_annotation) + + logger.info(f"Got drug annotations for {len(functional_annotations)} associations") + file_path = f"data/extractions/{pmcid}/functional_annotation.jsonl" + os.makedirs(os.path.dirname(file_path), exist_ok=True) + with open(file_path, "w") as f: + json.dump(functional_annotations, f, indent=4) + logger.info(f"Saved to file {file_path}") + + +if __name__ == "main": + test_functional_annotations() diff --git a/src/components/phenotype_annotation.py b/src/components/phenotype_annotation.py new file mode 100644 index 0000000..921a6ea --- /dev/null +++ b/src/components/phenotype_annotation.py @@ -0,0 +1,148 @@ +""" +Extract detailed drug annotation information for variants with drug associations. +""" + +from typing import List, Optional, Dict +from loguru import logger +from pydantic import BaseModel +from src.variants import Variant, QuotedStr, QuotedList +from src.components.all_associations import ( + VariantAssociation, + get_all_associations, + AssociationType, +) +from src.prompts import PromptHydrator, GeneratorPrompt +from src.inference import Generator, Parser +from src.utils import get_article_text +from src.config import DEBUG +import json +import os + +""" +Terms: +- Drug(s): +- Phenotype Category +- Association Significane +- Sentence Summary (get examples) +- Specialty Populations +- Notes: 3-4 sentence summary of the results of the study in relation to these variant and the found association. + +Explain your reasoning step by step by including the term, a one sentence explanation, and an exact quote from the article that details where +""" + + +class PhenotypeAnnotation(BaseModel): + associated_drugs: QuotedList + association_significance: QuotedStr + meatbolizer_info: Optional[QuotedStr] + specialty_populations: QuotedStr + sentence_summary: str + notes: Optional[str] + + +def get_association_background_prompt(variant_association: VariantAssociation): + background_prompt = "" + background_prompt += f"Variant ID: {variant_association.variant.content}\n" + background_prompt += ( + f"Association Summary: {variant_association.association_summary.content}\n" + ) + return background_prompt + + +KEY_QUESTION = """ +This article contains information on the following variant association: +{association_background} + +We are interested in completing a Phenotype Annotation report that is specifically interested in associations between genetic variants +and adverse drug reactions, toxicities, or clinical outcomes that represent: +- Toxicity/Safety outcomes +- Clinical phenotypes/adverse events + +Term: Drug(s) +- Content: Nme(s) of the drug(s) associated with the variant as part of this association along with a one sentence +description of the results. Convert the drug names to their generic before outputting if possible but include the original term in parentheses. + +Term: Phenotype Category +- Content: Type of clinical outcome studied (EXACTLY ONE: "Efficacy", "Metabolism/PK", "Toxicity", "Dosage", "Other") +- Example: Efficacy + +Term: Significance +- Content: Was this association statistically significant? Describe the author's reported p-value or relevant statistical values. + +Term: Specialty Population +- Content: Was an age-specific population studied as part of this association? (EXACTLY ONE: "Pediatric", "Geriatric", "No", or "Unknown") + +Term: Sentence +- Content: One sentence summary of the association. Make sure to include the following information roughly by following this +rough format: "[Genotype/Allele/Variant] is [associated with/not associated with] [increased/decreased] [outcome] [drug context] [population context]" +- Example: "HLA-B *35:08 is not associated with likelihood of Maculopapular Exanthema, severe cutaneous adverse reactions or Stevens-Johnson Syndrome when treated with lamotrigine in people with Epilepsy." + +Term: Notes +- Content: Any additional key study details, methodology, or important context +- Example: The allele was not significant when comparing allele frequency in cases of severe cutaneous adverse reactions (SCAR), Stevens-Johnson Syndrome (SJS) and Maculopapular Exanthema (MPE) (1/15) and controls (individuals without AEs who took lamotrigine) (0/50). The allele was significant when comparing between cases (1/15) and the general population (1/986)." +""" + +OUTPUT_QUEUES = """ +For each variant, extract all the above information and provide it in structured format + +For each variant, provide: +- All required fields filled with appropriate values or left empty if not applicable +- Ensure controlled vocabulary compliance for categorical fields +- Extract direct quotes from the article to support the annotations +""" + + +def get_phenotype_annotation(variant_association: VariantAssociation | Dict): + if isinstance(variant_association, dict): + variant_association = VariantAssociation(**variant_association) + prompt = GeneratorPrompt( + input_prompt=PromptHydrator( + prompt_template=KEY_QUESTION, + prompt_variables={ + "association_background": get_association_background_prompt( + variant_association + ), + }, + system_prompt=None, + output_format_structure=PhenotypeAnnotation, + ), + output_format_structure=PhenotypeAnnotation, + ).get_hydrated_prompt() + generator = Generator(model="gpt-4o") + return generator.generate(prompt) + + +def test_phenotype_annotations(): + """ + Output the extracted variant associations to a file + """ + pmcid = "PMC11730665" + article_text = get_article_text(pmcid) + logger.info(f"Got article text {pmcid}") + associations = get_all_associations(article_text) + + # Save associations + file_path = f"data/extractions/{pmcid}/associations.jsonl" + os.makedirs(os.path.dirname(file_path), exist_ok=True) + with open(file_path, "w") as f: + json.dump(associations, f, indent=4) + logger.info(f"Saved to file {file_path}") + + logger.info(f"Found {len(associations)} associations") + associations = [VariantAssociation(**association) for association in associations] + phenotype_annotations = [] + for association in associations: + if association.association_type == AssociationType.PHENOTYPE: + phenotype_annotation = get_phenotype_annotation(association) + phenotype_annotations.append(phenotype_annotation) + + logger.info(f"Got drug annotations for {len(phenotype_annotations)} associations") + file_path = f"data/extractions/{pmcid}/phenotype_annotation.jsonl" + os.makedirs(os.path.dirname(file_path), exist_ok=True) + with open(file_path, "w") as f: + json.dump(phenotype_annotations, f, indent=4) + logger.info(f"Saved to file {file_path}") + + +if __name__ == "main": + test_phenotype_annotations() diff --git a/src/components/study_parameters.py b/src/components/study_parameters.py new file mode 100644 index 0000000..3f2ec35 --- /dev/null +++ b/src/components/study_parameters.py @@ -0,0 +1,104 @@ +from pydantic import BaseModel +from src.variants import QuotedStr +from typing import List +from src.prompts import GeneratorPrompt, ArticlePrompt +from src.inference import Generator +from src.utils import get_article_text +from loguru import logger +import os +import json + + +class StudyParameters(BaseModel): + summary: str + study_type: QuotedStr + participant_info: QuotedStr + study_design: QuotedStr + study_results: QuotedStr + allele_frequency: QuotedStr + additional_resource_links: List[str] + + +KEY_QUESTION = """ +We are interested in creating a summary of the study design of this article. From the article, we want to extract the following information: + +Term: Study Type +- Content: The type of study conducted (e.g., case-control, cohort, cross-sectional, GWAS etc.) as well as if the study was +prospective, retrospective, a meta-analysis, a replication study, or a combination of these. +Here are descriptions of the major types: +GWAS: Genome-Wide Association Study; analyzes genetic variants across genomes to find associations with traits or diseases. +Case/control: Compares individuals with a condition (cases) to those without (controls) to identify associated factors. +Cohort: Observes a group over time to study incidence, causes, and prognosis of disease; can be prospective or retrospective. +Clinical trial: Interventional study where participants are assigned treatments and outcomes are measured. +Case series: Descriptive study tracking patients with a known exposure or treatment; no control group. +Cross sectional: Observational study measuring exposure and outcome simultaneously in a population. +Meta-analysis: Combines results from multiple studies to identify overall trends using statistical techniques. +Linkage: Genetic study mapping loci associated with traits by analyzing inheritance patterns in families. +Trios: Genetic study involving parent-offspring trios to identify de novo mutations. +Unknown: Unclassified or missing study type. +Unknown: Unclassified or missing study type. +Prospective: Study designed to follow subjects forward in time. +Retrospective: Uses existing records to look backward at exposures and outcomes. +Replication: Repeating a study to confirm findings. + +- Example: case/control, replication (Replication analysis within a case/control design) + +Term: Participant Information +- Content: Details about the participants, including age, gender, ethnicity, pre-existing conditions and any other relevant characteristics. +Also breakdown this information by study group if applicable. + +Term: Study Design +- Content: A description of the study design, including the study population, sample size, and any other relevant details + +Term: Study Results +- Content: A description of the study results, including the main findings and any other relevant details. Pay key attention to report the +ratio statistic (hazard ratio, odds ratio, etc.) and p-value. + +Term: Allele Frequency +- Content: Information related to the allele frequency of the variant in the study population. This should include the allele frequency in the studied +cohorts and experiments if relevant. + +Term: Additional Resource Links +- Content: Any additional resources or links provided in the study, such as the study protocol or data. This should not include other papers +merely references, but solely information that pertains to the design/execution of this study. +""" + +OUTPUT_QUEUES = """ +Provide info for these terms explaining your reasoning and providing quotes directly from the article to support your claim. Quotes are not needed for the summary +and Additional Resource Links. Make sure to follow the output schema carefully. +""" + + +def get_study_parameters(article_text): + prompt = GeneratorPrompt( + input_prompt=ArticlePrompt( + article_text=article_text, + key_question=KEY_QUESTION, + output_queues=OUTPUT_QUEUES, + ), + output_format_structure=StudyParameters, + ).get_hydrated_prompt() + generator = Generator(model="gpt-4o") + return generator.generate(prompt) + + +def test_study_parameters(): + """ + Output the extracted variant associations to a file + """ + pmcid = "PMC11730665" + article_text = get_article_text(pmcid) + logger.info(f"Got article text {pmcid}") + + study_parameters = get_study_parameters(article_text=article_text) + + # Save associations + file_path = f"data/extractions/{pmcid}/study_parameters.jsonl" + os.makedirs(os.path.dirname(file_path), exist_ok=True) + with open(file_path, "w") as f: + json.dump(study_parameters, f, indent=4) + logger.info(f"Saved to file {file_path}") + + +if __name__ == "main": + test_study_parameters() diff --git a/src/config.py b/src/config.py index 85bdcea..edfbcef 100644 --- a/src/config.py +++ b/src/config.py @@ -5,7 +5,7 @@ """ from loguru import logger -from typing import NoReturn +from typing import NoReturn, Optional import sys # Global debug flag @@ -15,7 +15,7 @@ logger.debug("Debug mode is enabled") -def set_debug(debug: bool) -> NoReturn: +def set_debug(debug: bool) -> None: """ Set the debug mode globally. @@ -31,7 +31,7 @@ def set_debug(debug: bool) -> NoReturn: logger.debug("Debug mode disabled") -def save_logs(save: bool = False) -> NoReturn: +def save_logs(save: bool = False) -> None: """ Configure logging to save logs to a file. diff --git a/src/inference.py b/src/inference.py index 95b7631..a95ab74 100644 --- a/src/inference.py +++ b/src/inference.py @@ -1,13 +1,26 @@ from loguru import logger import litellm -from typing import List +from typing import List, Optional, Union from dotenv import load_dotenv from pydantic import BaseModel from abc import ABC, abstractmethod from src.prompts import HydratedPrompt +import json load_dotenv() +LMResponse = str | dict | List[str] | List[dict] +""" +TODO: +Refactor this. Things that change from inference to inference are +- system prompt +- whether or not previous_responses are taken + +Look into Archon fomratting for taking in previous responses + +Add retry for connection errors +""" + class LLMInterface(ABC): """LLM Interface implemented by Generator and Parser classes""" @@ -17,8 +30,12 @@ def __init__(self, model: str = "gpt-4o-mini", temperature: float = 0.1): self.temperature = temperature def prompted_generate( - self, hydrated_prompt: HydratedPrompt, temperature: float = None + self, hydrated_prompt: HydratedPrompt, temperature: Optional[float] = None ) -> str: + """ + Added by default to all subclasses. Converts the general generate method into one + that accepts a HydratedPrompt. + """ temp = temperature if temperature is not None else self.temperature return self.generate( hydrated_prompt.input_prompt, @@ -27,16 +44,38 @@ def prompted_generate( hydrated_prompt.output_format_structure, ) - @abstractmethod def generate( self, - prompt: str, - system_prompt: str = None, - temperature: float = None, - response_format: BaseModel = None, - ) -> str: + input_prompt: str, + system_prompt: Optional[str] = None, + temperature: Optional[float] = None, + response_format: Optional[BaseModel] = None, + ) -> LMResponse: """Generate a response from the LLM.""" - pass + temp = temperature if temperature is not None else self.temperature + # Check if system prompt is provided + if system_prompt is not None and system_prompt != "": + messages = [ + {"role": "system", "content": system_prompt}, + {"role": "user", "content": input_prompt}, + ] + else: + logger.warning("No system prompt provided. Using default value") + messages = [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": input_prompt}, + ] + try: + response = litellm.completion( + model=self.model, + messages=messages, + response_format=response_format, + temperature=temp, + ) + except Exception as e: + logger.error(f"Error generating response: {e}") + raise e + return response.choices[0].message.content class Generator(LLMInterface): @@ -49,22 +88,38 @@ def __init__(self, model: str = "gpt-4o-mini", temperature: float = 0.1): if self.debug_mode: litellm.set_verbose = True - def generate( + def _generate_single( self, - prompt: str, - system_prompt: str = None, - temperature: float = None, - response_format: BaseModel = None, + input_prompt: str | HydratedPrompt, + system_prompt: Optional[str] = None, + temperature: Optional[float] = None, + response_format: LMResponse = None, ) -> str: + if isinstance(input_prompt, HydratedPrompt): + if ( + input_prompt.system_prompt is not None + and input_prompt.system_prompt != "" + ): + system_prompt = input_prompt.system_prompt + if ( + input_prompt.output_format_structure is not None + and response_format is None + ): + response_format = input_prompt.output_format_structure + input_prompt = input_prompt.input_prompt + temp = temperature if temperature is not None else self.temperature # Check if system prompt is provided if system_prompt is not None and system_prompt != "": messages = [ {"role": "system", "content": system_prompt}, - {"role": "user", "content": prompt}, + {"role": "user", "content": input_prompt}, ] else: - messages = [{"role": "user", "content": prompt}] + messages = [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": input_prompt}, + ] try: response = litellm.completion( model=self.model, @@ -75,7 +130,40 @@ def generate( except Exception as e: logger.error(f"Error generating response: {e}") raise e - return response.choices[0].message.content + response_content = response.choices[0].message.content + if isinstance(response_content, str) and response_format is not None: + try: + response_content = json.loads(response_content) + except: + logger.warning( + f"Response content was not a valid JSON string. Returning string" + ) + return response_content + + def generate( + self, + input_prompt: str, + system_prompt: Optional[str] = None, + temperature: Optional[float] = None, + response_format: Optional[BaseModel] = None, + samples: Optional[int] = 1, + ) -> LMResponse: + """ + Generate a response from the LLM. + """ + responses = [] + for _ in range(samples): + response = self._generate_single( + input_prompt=input_prompt, + system_prompt=system_prompt, + temperature=temperature, + response_format=response_format, + ) + responses.append(response) + if len(responses) == 1: + return responses[0] + + return responses class Parser(LLMInterface): @@ -91,10 +179,10 @@ def __init__(self, model: str = "gpt-4o-mini", temperature: float = 0.1): def generate( self, prompt: str, - system_prompt: str = None, - temperature: float = None, - response_format: BaseModel = None, - ) -> str: + system_prompt: Optional[str] = None, + temperature: Optional[float] = None, + response_format: Optional[BaseModel] = None, + ) -> LMResponse: temp = temperature if temperature is not None else self.temperature # Check if system prompt is provided if system_prompt is not None and system_prompt != "": @@ -103,13 +191,10 @@ def generate( {"role": "user", "content": prompt}, ] else: - logger.warning( - "No system prompt provided. Using default system prompt. System prompts recommended for parsing." - ) messages = [ { "role": "system", - "content": "Your job is to parse the response into a structured output. Please provide your response in the exact format specified by the response_format parameter.", + "content": "You are a helpful assistant whose job is to parse the response into a structured output.", }, {"role": "user", "content": prompt}, ] @@ -124,3 +209,48 @@ def generate( logger.error(f"Error generating response: {e}") raise e return response.choices[0].message.content + + +class Fuser(LLMInterface): + + debug_mode = False + + def __init__(self, model: str = "gpt-4o-mini", temperature: float = 0.1): + super().__init__(model, temperature) + if self.debug_mode: + litellm.set_verbose = True + + def generate( + self, + input_prompt: str, + system_prompt: Optional[str] = None, + temperature: Optional[float] = None, + response_format: Optional[BaseModel] = None, + ) -> LMResponse: + temp = temperature if temperature is not None else self.temperature + # Check if system prompt is provided + if system_prompt is not None and system_prompt != "": + messages = [ + {"role": "system", "content": system_prompt}, + {"role": "user", "content": input_prompt}, + ] + else: + logger.warning("") + messages = [ + { + "role": "system", + "content": "You are a helpful assistant who fuses multiple responses into a comprehensive final response", + }, + {"role": "user", "content": input_prompt}, + ] + try: + response = litellm.completion( + model=self.model, + messages=messages, + response_format=response_format, + temperature=temp, + ) + except Exception as e: + logger.error(f"Error generating response: {e}") + raise e + return response.choices[0].message.content diff --git a/src/prompts.py b/src/prompts.py index 24424f0..d9d1908 100644 --- a/src/prompts.py +++ b/src/prompts.py @@ -1,6 +1,7 @@ from typing import Optional, Type, List, Union from loguru import logger from pydantic import BaseModel +from src.utils import get_article_text """ This module is used to generate prompts for the LLM. @@ -12,7 +13,7 @@ - output format """ -GENERATOR_PROMPT_TEMPLATE = """ +ARTICLE_PROMPT_TEMPLATE = """ You are an expert pharmacogenomics researcher reading and extracting key information from the following article: {article_text} @@ -23,47 +24,109 @@ """ -class PromptVariables(BaseModel): +class HydratedPrompt(BaseModel): + """Final prompt with system and input components.""" + + system_prompt: Optional[str] = None + input_prompt: str + output_format_structure: Optional[Type[BaseModel]] = None + + +class PromptHydrator(BaseModel): + """Prompt hydrator.""" + + prompt_template: str + prompt_variables: dict + system_prompt: Optional[str] = None + output_format_structure: Optional[Type[BaseModel]] = None + + def get_hydrated_prompt(self) -> HydratedPrompt: + """Hydrate the prompt.""" + # Check to make sure all prompt_variables are in the prompt_template + for key, value in self.prompt_variables.items(): + if key not in self.prompt_template: + logger.warning(f"Prompt variable {key} not found in prompt template") + + input_prompt = self.prompt_template.format(**self.prompt_variables) + return HydratedPrompt( + system_prompt=self.system_prompt, + input_prompt=input_prompt, + output_format_structure=self.output_format_structure, + ) + + +class ArticlePrompt(PromptHydrator): """Input variables for prompt generation. Members: - article_text: The text of the article. + article_text: The text of the article or PMC ID. key_question: The key question to answer. output_queues: The output queues to use. - system_prompt: The system prompt to use. - output_format_structure: The output format structure to use. """ - article_text: str - key_question: str - output_queues: Optional[str] = None - system_prompt: Optional[str] = None - output_format_structure: Optional[Union[Type[BaseModel], List[Type[BaseModel]]]] = ( - None - ) + def __init__( + self, + article_text: str, + key_question: str, + output_queues: Optional[str] = None, + system_prompt: Optional[str] = None, + output_format_structure: Optional[Type[BaseModel]] = None, + ) -> None: + # First initialize the parent class with base attributes + super().__init__( + prompt_template=ARTICLE_PROMPT_TEMPLATE, + prompt_variables={}, # Start with empty dict + system_prompt=system_prompt, + output_format_structure=output_format_structure, + ) + # Set article text and update prompt variables + self._article_text = article_text + self.prompt_variables.update( + { + "article_text": self.article_text, + "key_question": key_question, + "output_queues": output_queues or "", + } + ) -class HydratedPrompt(BaseModel): - """Final prompt with system and input components.""" + @property + def article_text(self) -> str: + """Get the article text, fetching from file if PMC ID is provided.""" + if self._article_text.startswith("PMC"): + return get_article_text(self._article_text) + return self._article_text - system_prompt: Optional[str] = None - input_prompt: str - output_format_structure: Optional[Type[BaseModel]] = None + def get_hydrated_prompt(self) -> HydratedPrompt: + """Get the hydrated prompt with resolved article text.""" + return super().get_hydrated_prompt() class GeneratorPrompt: - def __init__(self, prompt_variables: PromptVariables): - self.prompt_template = GENERATOR_PROMPT_TEMPLATE - self.prompt_variables = prompt_variables + def __init__( + self, + input_prompt: str | ArticlePrompt, + output_format_structure: Type[BaseModel], + system_prompt: Optional[str] = None, + ): + self.input_prompt = input_prompt + self.output_format_structure = output_format_structure + self.system_prompt = system_prompt - def hydrate_prompt(self) -> HydratedPrompt: + def get_hydrated_prompt(self) -> HydratedPrompt: """Hydrate the prompt.""" + if isinstance(self.input_prompt, PromptHydrator): + hydrated = self.input_prompt.get_hydrated_prompt() + self.input_prompt = hydrated.input_prompt + if not self.system_prompt and hydrated.system_prompt: + self.system_prompt = hydrated.system_prompt + if not self.output_format_structure and hydrated.output_format_structure: + self.output_format_structure = hydrated.output_format_structure + return HydratedPrompt( - system_prompt=self.prompt_variables.system_prompt, - input_prompt=self.prompt_template.format( - **self.prompt_variables.model_dump() - ), - output_format_structure=self.prompt_variables.output_format_structure, + system_prompt=self.system_prompt, + input_prompt=self.input_prompt, + output_format_structure=self.output_format_structure, ) @@ -74,7 +137,7 @@ def __init__( self, input_prompt: str, output_format_structure: Type[BaseModel], - system_prompt: str = None, + system_prompt: Optional[str] = None, ): self.input_prompt = input_prompt self.output_format_structure = output_format_structure @@ -88,10 +151,37 @@ def __init__( logger.error("Output format structure is required for parser prompt.") raise ValueError("Output format structure is required for parser prompt.") - def hydrate_prompt(self) -> HydratedPrompt: + def get_hydrated_prompt(self) -> HydratedPrompt: """Hydrate the prompt.""" return HydratedPrompt( system_prompt=self.system_prompt, input_prompt=self.input_prompt, output_format_structure=self.output_format_structure, ) + + +class FuserPrompt: + def __init__( + self, + previous_responses: List[str], + input_prompt: Optional[str] = None, + output_format_structure: Optional[Type[BaseModel]] = None, + system_prompt: Optional[str] = None, + ): + self.previous_responses = previous_responses + self.input_prompt = input_prompt + self.output_format_structure = output_format_structure + self.system_prompt = system_prompt + self.complete_prompt = "" + + def get_hydrated_prompt(self) -> HydratedPrompt: + for i, response in enumerate(self.previous_responses): + self.complete_prompt += f"Response {i}\n" + self.complete_prompt += response + if self.input_prompt: + self.complete_prompt += self.input_prompt + return HydratedPrompt( + system_prompt=self.system_prompt, + input_prompt=self.complete_prompt, + output_format_structure=self.output_format_structure, + ) diff --git a/src/utils.py b/src/utils.py index 4e88fe0..7844266 100644 --- a/src/utils.py +++ b/src/utils.py @@ -1,10 +1,12 @@ import re from loguru import logger import json -from typing import List +from typing import List, Optional from termcolor import colored from src.article_parser import MarkdownParser +_true_variant_cache: Optional[dict] = None + def extractVariantsRegex(text): # Note, seems to extract a ton of variants, not just the ones that are being studied @@ -76,15 +78,32 @@ def compare_lists( return true_positives, true_negatives, false_positives, false_negatives -def get_true_variants(pmcid): +def get_true_variants(pmcid: str) -> List[str]: """ Get the actual annotated variants for a given PMCID. + Uses module-level caching to load the JSON file only once. """ - true_variant_list = json.load(open("data/benchmark/true_variant_list.json")) - return true_variant_list[pmcid] - - -def get_article_text(pmcid: str = None, article_text: str = None): + global _true_variant_cache + + if _true_variant_cache is None: + try: + with open("data/benchmark/true_variant_list.json", "r") as f: + _true_variant_cache = json.load(f) + except FileNotFoundError: + logger.error( + "True variant list file not found: data/benchmark/true_variant_list.json" + ) + _true_variant_cache = {} + except json.JSONDecodeError as e: + logger.error(f"Error parsing true variant list JSON: {e}") + _true_variant_cache = {} + + return _true_variant_cache.get(pmcid, []) if _true_variant_cache else [] + + +def get_article_text( + pmcid: Optional[str] = None, article_text: Optional[str] = None +) -> str: """ Get the article text for a given PMCID or return the article text if it is already provided. """ @@ -96,3 +115,17 @@ def get_article_text(pmcid: str = None, article_text: str = None): article_text = MarkdownParser(pmcid=pmcid).get_article_text() return article_text + + +def is_pmcid(text: str): + if text.startswith("PMC") and len(text) < 20: + return True + return False + + +def get_title(markdown_text: str): + # get the title from the markdown text + title = markdown_text.split("\n")[0] + # remove the # from the title + title = title.replace("# ", "") + return title diff --git a/src/variants.py b/src/variants.py index e165f44..c3cab5b 100644 --- a/src/variants.py +++ b/src/variants.py @@ -2,6 +2,18 @@ from typing import List +class QuotedStr(BaseModel): + content: str + explanation: str + quotes: List[str] + + +class QuotedList(BaseModel): + contents: List[str] + explanation: str + quotes: List[str] + + class Variant(BaseModel): """Variant.""" @@ -15,3 +27,109 @@ class VariantList(BaseModel): """List of variants.""" variant_list: List[Variant] + + +class DrugAnnotation(BaseModel): + """Drug annotation with detailed pharmacogenomic information.""" + + variant_annotation_id: int + variant_haplotypes: str + gene: str | None = None + drugs: str + pmid: int + phenotype_category: str + significance: str + notes: str + sentence: str + alleles: str | None = None + specialty_population: str | None = None + metabolizer_types: str | None = None + is_plural: str | None = None + is_is_not_associated: str + direction_of_effect: str | None = None + side_effect_efficacy_other: str | None = None + phenotype: str | None = None + multiple_phenotypes_and_or: str | None = None + when_treated_with_exposed_to: str | None = None + multiple_drugs_and_or: str | None = None + population_types: str | None = None + population_phenotypes_or_diseases: str | None = None + multiple_phenotypes_or_diseases_and_or: str | None = None + comparison_alleles_or_genotypes: str | None = None + comparison_metabolizer_types: str | None = None + + +class DrugAnnotationList(BaseModel): + """List of drug annotations for structured output.""" + + drug_annotations: List[DrugAnnotation] + + +class PhenotypeAnnotation(BaseModel): + """Phenotype annotation with detailed pharmacogenomic information.""" + + variant_annotation_id: int + variant_haplotypes: str + gene: str | None = None + drugs: str | None = None + pmid: int + phenotype_category: str + significance: str + notes: str + sentence: str + alleles: str | None = None + specialty_population: str | None = None + metabolizer_types: str | None = None + is_plural: str | None = None + is_is_not_associated: str + direction_of_effect: str | None = None + side_effect_efficacy_other: str | None = None + phenotype: str | None = None + multiple_phenotypes_and_or: str | None = None + when_treated_with_exposed_to: str | None = None + multiple_drugs_and_or: str | None = None + population_types: str | None = None + population_phenotypes_or_diseases: str | None = None + multiple_phenotypes_or_diseases_and_or: str | None = None + comparison_alleles_or_genotypes: str | None = None + comparison_metabolizer_types: str | None = None + + +class PhenotypeAnnotationList(BaseModel): + """List of phenotype annotations for structured output.""" + + phenotype_annotations: List[PhenotypeAnnotation] + + +class FunctionalAnnotation(BaseModel): + """Functional annotation with detailed mechanistic information.""" + + variant_annotation_id: int + variant_haplotypes: str + gene: str | None = None + drugs: str | None = None + pmid: int + phenotype_category: str + significance: str + notes: str + sentence: str + alleles: str | None = None + specialty_population: str | None = None + assay_type: str | None = None + metabolizer_types: str | None = None + is_plural: str | None = None + is_is_not_associated: str + direction_of_effect: str | None = None + functional_terms: str | None = None + gene_gene_product: str | None = None + when_treated_with_exposed_to: str | None = None + multiple_drugs_and_or: str | None = None + cell_type: str | None = None + comparison_alleles_or_genotypes: str | None = None + comparison_metabolizer_types: str | None = None + + +class FunctionalAnnotationList(BaseModel): + """List of functional annotations for structured output.""" + + functional_annotations: List[FunctionalAnnotation] diff --git a/tests/variant_list_tests.py b/tests/variant_list_tests.py deleted file mode 100644 index 763b537..0000000 --- a/tests/variant_list_tests.py +++ /dev/null @@ -1,70 +0,0 @@ -from loguru import logger -from src.components.all_variants import extract_all_variants -import json -from typing import List -from src.utils import compare_lists -from typing import List - -def load_ground_truth(pmcid: str): - try: - with open(f"tests/data/true_variant_list.json", "r") as f: - try: - return json.load(f)[pmcid] - except KeyError: - logger.error(f"PMCID {pmcid} not found in ground truth file (tests/data/true_variant_list.json)") - return [] - except FileNotFoundError: - logger.error(f"Ground truth file for PMCID {pmcid} not found (tests/data/true_variant_list.json)") - return [] - -def parse_variant_list(variant_list): - return [i['variant_id'] for i in variant_list] - -def calc_contingencies(ground_truth: List[str], extracted: List[str]): - true_positives = len(set(ground_truth) & set(extracted)) - true_negatives = len(set(extracted) - set(ground_truth)) - false_positives = len(set(extracted) - set(ground_truth)) - false_negatives = len(set(ground_truth) - set(extracted)) - return { - "true_positives": true_positives, - "true_negatives": true_negatives, - "false_positives": false_positives, - "false_negatives": false_negatives, - } - -def calc_metrics(contingencies): - precision = contingencies["true_positives"] / (contingencies["true_positives"] + contingencies["false_positives"]) - recall = contingencies["true_positives"] / (contingencies["true_positives"] + contingencies["false_negatives"]) - f1_score = 2 * (precision * recall) / (precision + recall) - return precision, recall, f1_score - -def test_extract_function(pmcids: List[str] | str, verbose: bool = False): - running_contingencies = { - "true_positives": 0, - "true_negatives": 0, - "false_positives": 0, - "false_negatives": 0, - } - # Test the extract function - if isinstance(pmcids, str): - pmcids = [pmcids] - - for pmcid in pmcids: - logger.info(f"Testing PMCID: {pmcid}") - ground_truth = parse_variant_list(load_ground_truth(pmcid)) - extracted = parse_variant_list(extract_all_variants(pmcid)) - contingencies = calc_contingencies(ground_truth, extracted) - # update running contingencies - running_contingencies["true_positives"] += contingencies["true_positives"] - running_contingencies["true_negatives"] += contingencies["true_negatives"] - running_contingencies["false_positives"] += contingencies["false_positives"] - running_contingencies["false_negatives"] += contingencies["false_negatives"] - if verbose: - compare_lists(extracted, ground_truth, pmcid) - - # calculate final metrics - precision, recall, f1_score = calc_metrics(running_contingencies) - print(f"Final Metrics: Precision: {precision}, Recall: {recall}, F1 Score: {f1_score}") - -if __name__ == "__main__": - test_extract_function("PMC11730665", verbose=True) \ No newline at end of file